使用的DataContractSerializer

问题描述:

我无法用DataContractSerializer的序列化不可改变的情况下遇到问题,因为在类中的属性,我序列化是缺少setter方法。问题是,我只是想序列化实例(只所以可以写入日志),我会永远需要向反序列化。有没有办法绕过这种行为?使用的DataContractSerializer

类我试图序列:

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(); 
} 

可以放置在领域[DataMember]从而使你拥有财产性干将:

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

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

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

用于序列化类的代码。这些字段仍然可以是私人的。然而,它不能readonly因为它需要来构造对象然后设置的字段。

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

+0

非常感谢你。在发布问题之前,我应该想到这一点。 :) – Patrik 2010-06-29 07:32:59

+0

不知道这个改变,但在.NET 4.5.1可以序列和反序列化只读字段 – serine 2013-09-22 01:43:54

这个版本使用ISerializable的属性而不是[DataContract]。 我不知道这将如何影响可操作性,但并不需要一个公共的制定者。

[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); 
    } 
}