Unity C#ArrayList对象序列化为XML Utf8-原语错误

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格式。当

我有一个ArrayList,其中包含一些用户对象。我正在尝试将它们序列化为XML格式,以便发送到Web服务器。格式必须是UTF 8

我一直遇到这个错误:

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#的反序列化程序应该为您透明地处理任何编码