Unity C#ArrayList对象序列化为XML Utf8-原语错误
我有一个ArrayList,其中包含一些用户对象。我正在尝试将它们序列化为XML格式,以便发送到Web服务器。格式必须是UTF 8 我一直遇到这个错误:Unity C#ArrayList对象序列化为XML Utf8-原语错误,c#,xml,serialization,utf-8,unity3d,C#,Xml,Serialization,Utf 8,Unity3d,我有一个ArrayList,其中包含一些用户对象。我正在尝试将它们序列化为XML格式,以便发送到Web服务器。格式必须是UTF 8 我一直遇到这个错误: The type of the argument object 'User' is not primitive. 这实际上是两个问题,但是主要的一个问题是,这个原始错误不允许我尝试utf8和其他web示例。我只是不明白它为什么这样做。我试过使用: [Serializable] 目前我有一个函数可以工作,但它不能将xml转换为utf8格式。当
The type of the argument object 'User' is not primitive.
这实际上是两个问题,但是主要的一个问题是,这个原始错误不允许我尝试utf8和其他web示例。我只是不明白它为什么这样做。我试过使用:
[Serializable]
目前我有一个函数可以工作,但它不能将xml转换为utf8格式。当我在网上尝试任何其他的例子时,我会得到这个原始的错误。以下是我目前的代码:
我的用户类:
using System;
using System.Xml;
using System.Xml.Serialization;
[Serializable]
public class User
{
public int UserID { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public DateTime DateCreated { get; set; }
public string DeviceMacAddr { get; set; }
public DateTime LastLoggedIn { get; set; }
public float LastLoggedLat { get; set; }
public float LastLoggedLong { get; set; }
public bool Active { get; set; }
public string SyncStatus { get; set; }
public DateTime LastSyncDate { get; set; }
}
我的XML编写脚本:
using UnityEngine;
using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
public class XmlWriting : MonoBehaviour {
private string formatString = "'yyyy'##'MM'##'dd' 'HH'*'mm'*'ss'";
[XmlAttribute("Users")]
ArrayList Users = new ArrayList();
//List<User> Users = new List<User>();
// Use this for initialization
void Start () {
Users.Add(new User { UserID = 1,
Name = "Test Woman",
Password = "aa",
DateCreated = DateTime.Now,
DeviceMacAddr = "24:70:8c:83:86:BD",
LastLoggedIn = DateTime.Now,
LastLoggedLat = 36.083101f,
LastLoggedLong = -11.263433f,
Active = true,
SyncStatus = "Awaiting Response",
LastSyncDate = DateTime.Now,
}
);
Users.Add(new User { UserID = 2,
Name = "Test Man",
Password = "aa",
DateCreated = DateTime.Now,
DeviceMacAddr = "74:21:0c:93:46:XD",
LastLoggedIn = DateTime.Now,
LastLoggedLat = 83.083101f,
LastLoggedLong = -3.261823f,
Active = true,
SyncStatus = "Complete",
LastSyncDate = DateTime.Now,
}
);
var serializer = new XmlSerializer(typeof(ArrayList));
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, System.Text.Encoding.UTF8);
serializer.Serialize(streamWriter, Users);
byte[] utf8EncodedXml = memoryStream.ToArray();
Debug.Log ("SerializeArrayList: " );//+ utf8EncodedXml);
}
// Update is called once per frame
void Update () {
}
private string SerializeArrayList(ArrayList obj)
{
XmlDocument doc = new XmlDocument();
XmlSerializer serializer = new XmlSerializer(typeof(ArrayList), new Type[]{typeof(User)});
using (MemoryStream stream = new System.IO.MemoryStream())
{
try
{
serializer.Serialize(stream, obj);
stream.Position = 0;
doc.Load(stream);
Debug.Log ("stream: " + doc.InnerXml);
return doc.InnerXml;
}
catch (Exception ex)
{
}
}
return string.Empty;
}
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
}
}
使用UnityEngine;
使用制度;
使用系统集合;
使用系统文本;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
使用System.Collections.Generic;
公共类XmlWriting:单一行为{
私有字符串formatString=“'yyyy'##'MM'##'dd''HH'*'MM'*'ss';
[XmlAttribute(“用户”)]
ArrayList用户=新建ArrayList();
//列表用户=新列表();
//用于初始化
无效开始(){
添加(新用户{UserID=1,
Name=“测试女性”,
Password=“aa”,
DateCreated=DateTime。现在,
DeviceMacAddr=“24:70:8c:83:86:BD”,
LastLoggedIn=日期时间。现在,
LastLoggedLat=36.083101f,
LastLoggedLong=-11.263433f,
活动=真,
SyncStatus=“等待响应”,
LastSyncDate=日期时间。现在,
}
);
添加(新用户{UserID=2,
Name=“测试人员”,
Password=“aa”,
DateCreated=DateTime。现在,
DeviceMacAddress=“74:21:0c:93:46:XD”,
LastLoggedIn=日期时间。现在,
LastLoggedLat=83.083101f,
LastLoggedLong=-3.261823f,
活动=真,
SyncStatus=“完成”,
LastSyncDate=日期时间。现在,
}
);
var serializer=newxmlserializer(typeof(ArrayList));
var memoryStream=新的memoryStream();
var streamWriter=newstreamwriter(memoryStream,System.Text.Encoding.UTF8);
serializer.Serialize(streamWriter,用户);
字节[]utf8EncodedXml=memoryStream.ToArray();
Log(“SerializeArrayList:”;//+utf8EncodedXml);
}
//每帧调用一次更新
无效更新(){
}
私有字符串序列化ArrayList(ArrayList obj)
{
XmlDocument doc=新的XmlDocument();
XmlSerializer serializer=新的XmlSerializer(typeof(ArrayList),新类型[]{typeof(User)});
使用(MemoryStream stream=new System.IO.MemoryStream())
{
尝试
{
serializer.Serialize(流,obj);
流位置=0;
单据加载(流);
Log(“流:+doc.InnerXml”);
返回doc.InnerXml;
}
捕获(例外情况除外)
{
}
}
返回字符串。空;
}
公共类Utf8StringWriter:StringWriter
{
公共覆盖编码
{
获取{return Encoding.UTF8;}
}
}
}
非常感谢您的帮助。
谢谢您需要将[Serializable]属性放在用户和其他每个要序列化的类的类定义之上。至于UTF-8,这不要紧,至少在逻辑上不要紧——另一端的C#的反序列化程序应该为您透明地处理任何编码