我在使用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();
}
答案 0 :(得分:3)
您可以将[DataMember]
放在字段上,从而允许您拥有属性获取者。这些字段仍然可以是私有的。但是它不能是readonly
,因为它需要构造对象然后设置字段。
[编辑]
这将导致使用字段名称,除非您使用[DataMember(Name = "Name1")]
答案 1 :(得分:3)
此版本使用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);
}
}