【问题标题】:Having trouble using DataContractSerializer使用 DataContractSerializer 时遇到问题
【发布时间】:2011-03-09 11:46:21
【问题描述】:

我在使用 DataContractSerializer 序列化不可变实例时遇到问题,因为我正在序列化的类的属性缺少 setter。问题是我只想序列化实例(只是为了将其写入日志),而我从不需要反序列化它。有没有办法绕过这种行为?

我要序列化的类:

[DataContract]
public class Person
{
    private readonly string _name;

    [DataMember]
    public string Name
    {
        get { return _name; }
    }

    public Person(string name)
    {
        _name = name;
    }
}

用于序列化类的代码:

public string Serialize()
{
    var serializer = new DataContractSerializer(typeof(Person));
    StringBuilder stringBuilder = new StringBuilder();
    using (XmlWriter writer = XmlWriter.Create(stringBuilder)) {
        serializer.WriteObject(writer, this);
    }
    return stringBuilder.ToString();
}

【问题讨论】:

    标签: c# .net serialization datacontractserializer


    【解决方案1】:

    您可以将[DataMember] 放在字段上,从而允许您拥有属性获取器。这些字段仍然可以是私有的。但是它不能是readonly,因为它需要构造对象然后设置字段。

    [编辑] 这将导致使用字段名称,除非您使用 [DataMember(Name = "Name1")]

    【讨论】:

    • 非常感谢。在发布问题之前我应该​​想到这一点。 :)
    • 不知道这是否改变了,但在 .net 4.5.1 中,您可以序列化和反序列化只读字段
    【解决方案2】:

    此版本使用 ISerializable 属性而不是 [DataContract]。 我不知道这会如何影响可操作性,但不需要公共 setter。

    [Serializable]
    public class Person : ISerializable
    {
        private readonly string _name;
    
        public string Name
        {
            get { return _name; }
        }
    
        public Person(string name)
        {
            _name = name;
        }
    
        public string Serialize()
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(Person));
            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
            using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(stringBuilder))
            {
                serializer.WriteObject(writer, this);
            }
            return stringBuilder.ToString();
        }
    
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Name", _name);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 1970-01-01
      • 2012-02-21
      • 2021-11-08
      • 2014-01-08
      • 2013-01-30
      • 2016-11-13
      • 2016-07-21
      相关资源
      最近更新 更多