【问题标题】:Problems Serializing Object序列化对象的问题
【发布时间】:2013-03-30 11:23:01
【问题描述】:

我在 C# 中有这个类

public class ExerciseDTO {
    Dictionary<String, String> qa;
    private String materialId, content, topic;

    //constructors

    //properties

    public void makePersistent(String path) {
        Stream outputStream = File.OpenWrite(path + @"\" + this.topic + ".xml");
        XmlSerializer serializer = new XmlSerializer(typeof(ExerciseDTO));
        serializer.Serialize(outputStream, this);
        outputStream.Flush();
        outputStream.Close();
    }
}

调用makePersistent 方法会使应用程序抛出带有消息An error occured while reflecting object of type ExerciseDTO 的异常。为什么我不能序列化这个类的实例?

【问题讨论】:

    标签: c# serialization xml-serialization


    【解决方案1】:

    为什么我不能序列化这个类的实例?

    因为XmlSerializerdoesn't support serializing Dictionary&lt;TKey, TValue&gt; 属性。

    作为替代方案,您可以使用支持字典的DataContractSerializer

    【讨论】:

    • 报错说它反射对象有问题,我认为.NET平台中的反射实现应该独立于XmlSerializer。您确定它只有无法持久化的 XmlSerializer Dictionary 还是所有序列化器?
    • 不,只有XmlSerializer 不支持字典。 DataContractSerializer 与字典类型完美配合。我已更新我的答案以包含此信息。
    • 那太好了;你的意思是我可以用二进制序列化器序列化字典,对吧?反正谁在乎 XML?我只需要持久化和检索我的对象。
    【解决方案2】:

    正如 Darin 所说,Dictionary 不是 XML 可序列化的。您可以创建自己的 XmlSerializableDictionary。网上有很多很好的例子。这是一个:

    http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

    如果链接将来失效,复制/粘贴:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml.Serialization;
    
    [XmlRoot("dictionary")]
    public class SerializableDictionary<TKey, TValue>
        : Dictionary<TKey, TValue>, IXmlSerializable
    {
        #region IXmlSerializable Members
    
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
    
        public void ReadXml(System.Xml.XmlReader reader)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
            bool wasEmpty = reader.IsEmptyElement;
    
            reader.Read();
    
            if (wasEmpty)
                return;
    
            while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
            {
                reader.ReadStartElement("item");
                reader.ReadStartElement("key");
    
                TKey key = (TKey)keySerializer.Deserialize(reader);
    
                reader.ReadEndElement();
                reader.ReadStartElement("value");
    
                TValue value = (TValue)valueSerializer.Deserialize(reader);
                reader.ReadEndElement();
                this.Add(key, value);
                reader.ReadEndElement();
                reader.MoveToContent();
            }
    
            reader.ReadEndElement();
        } 
    
        public void WriteXml(System.Xml.XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
    
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
    
            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("item");
    
                writer.WriteStartElement("key");
                keySerializer.Serialize(writer, key);
                writer.WriteEndElement();
                writer.WriteStartElement("value");
                TValue value = this[key];
                valueSerializer.Serialize(writer, value);
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
        }
        #endregion
    }
    

    【讨论】:

      【解决方案3】:
      [Serializable]
      public class ExerciseDTO {
      ...
      }
      
      • 您还应该有一个默认(无参数)构造函数
      • 如果你想自动序列化你的属性,你也应该公开它
      • .net 不支持 Dictionary 的序列化,但是有一些解决方法,例如 this post

      编辑:如下评论:它应该是“XmlSerializer 类不支持 Dictionary 的序列化”。

      【讨论】:

      • .net 不支持字典的序列化 你在开玩笑吗???我什至发现它不能序列化指定为接口类型的引用!么么哒???现在我认为准确地说.NET 是我编写过的最糟糕的平台!除了 WindowsPhone 之外,我再也不会用它来做任何事情了!到目前为止,Java 表现出色!
      • serialization of a Dictionary&lt;&gt; is not supported by .net 不是一个真实的陈述。更正确的说法是serialization of a Dictionary&lt;&gt; is not supported by the XmlSerializer class。您可以使用支持字典的DataContractSerializer 类。
      • @DarinDimitrov,我们总是在上下文中谈论某事,我已经提供了一个在 .net 中完成此操作的链接,所以你的评论似乎是......,我不知道,我只是希望人们能从我的回答中找到有用的东西,我也希望人们也能从你的 cmets 中找到有用的东西。无论如何,我为您更新的评论投了赞成票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多