【问题标题】:Serialize ArrayList of Objects序列化对象的 ArrayList
【发布时间】:2013-01-18 11:43:01
【问题描述】:

我有一个存储自定义对象的 ArrayList。我想将该 ArrayList 序列化为字符串,以便可以将其保存在应用程序设置中。

这个问题看起来可以解决,但在 java.lang.而且我对 XML 并不聪明,所以有人可以帮忙吗? Serialize an ArrayList of Date object type

我有我的 ArrayList 设置:

...
MyObject tempObj = new MyObject("something",1,"something");
MyCollection.Add(tempObj);
...

我最初有这个。它输出字符串,但对象不存在:

    private string SerializeArrayList(ArrayList obj)
    {
            System.Xml.XmlDocument doc = new XmlDocument();
            Type[] extraTypes = new Type[1];
            extraTypes[0] = typeof(MyObject);
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), extraTypes);
            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            try
            {
                serializer.Serialize(stream, obj);
                stream.Position = 0;
                doc.Load(stream);
                return doc.InnerXml;
            }
            catch { throw; }
            finally
            {
                stream.Close();
                stream.Dispose();
            }
}

编辑:代码请求

    public class MyObject
    {
        private string eN;      
        private Boolean bE;          
        private int min;         
        private Boolean bot;       
        private string onE;         


        public MyObject(string na, Boolean b)
        {
          ...
        }


        public MyObject()
        {
        }

        public string GetSomething()
        {
            ...

【问题讨论】:

  • 您可以添加MyObject 的代码吗?另外,你能把你得到的结果和你期望的结果相加吗?
  • “它输出字符串,但对象不存在”是什么意思?您正在尝试序列化为字符串吗?
  • 是的,我把它叫做 string tmp = SerializeArrayList(MyCollection);将编辑 main.
  • 1完成编辑!请检查主
  • 您是否将自定义对象的类标记为serializable

标签: c# xml object serialization arraylist


【解决方案1】:

我测试了你的代码,它似乎可以正常工作,只要你的对象上有[Serializable]

此外,如果您尝试对字段进行序列化,则必须将它们设为公共属性。

我的测试:

    ArrayList array = new ArrayList();
    Rules tempObj = new Rules { onE = "Value", min = 45, eN = "Value" };
    array.Add(tempObj);
    string result = SerializeArrayList(array);

    private string SerializeArrayList(ArrayList obj)
    {
        XmlDocument doc = new XmlDocument();
        XmlSerializer serializer = new XmlSerializer(typeof(ArrayList), new Type[]{typeof(Rules)});
        using (MemoryStream stream = new System.IO.MemoryStream())
        {
            try
            {
                serializer.Serialize(stream, obj);
                stream.Position = 0;
                doc.Load(stream);
                return doc.InnerXml;
            }
            catch (Exception ex)
            {
            }
        }
        return string.Empty;
    }

对象:

[Serializable]
[XmlType(TypeName = "Rules")]
public class Rules
{
    // Make fields propertys so they will be serialized
    public string eN { get; set; }      //Name
    public Boolean bE { get; set; }     //Whether blocked entirely
    public int min { get; set; }        //Minutes they are allowed if blocked
    public Boolean bot { get; set; }    //Create notification if allowance exceed
    public string onE { get; set; }     //Nothing or CLOSE Process

    public Rules(string na, Boolean b)
    {

    }

    public Rules()
    {
    }
}

【讨论】:

  • 我没有在顶部有那个 [Serializable],所以看一下。谢谢
  • 你是今天的赢家!不知道必须拥有 get/setter 而不是在构造函数中初始化。谢谢老兄
  • !!必须声明 getter/setter 才能使序列化工作!
【解决方案2】:

我遇到了类似的问题,有一个很棒的程序,叫做 SharpSerializer,可以通过 Nuget 获得。它会很容易地处理您的 ArrayList,只需输入代码:

 SharpSerializer mySerializer = new SharpSerializer();
 mySerializer.Serialize(ArrayList, "filetosaveto.xml");

这是网站的链接,它是免费的,所以不用担心支付任何费用:

http://www.sharpserializer.com/en/index.html

【讨论】:

  • 感谢您的回答,但我正在寻找手动解决方案。不过给你一个赞成票:)
  • 我明白了。我希望精通 XML 的人能给你一些关于你的问题的反馈。如果没有,您可以查看 SharpSerializer 的源代码,看看是否对您有帮助。不管怎样,希望你能弄清楚。
猜你喜欢
  • 2015-03-18
  • 2014-07-10
  • 2014-07-10
  • 2020-08-02
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
相关资源
最近更新 更多