使用的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")]
答
这个版本使用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);
}
}
非常感谢你。在发布问题之前,我应该想到这一点。 :) – Patrik 2010-06-29 07:32:59
不知道这个改变,但在.NET 4.5.1可以序列和反序列化只读字段 – serine 2013-09-22 01:43:54