C# 使用DataContractSerializer时遇到问题
使用DataContractSerializer序列化不可变实例时遇到问题,因为我序列化的类上的属性缺少setter。问题是,我只想序列化实例(只是为了将其写入日志),而且我永远不需要对其进行反序列化。有没有办法绕过这种行为 我尝试序列化的类:C# 使用DataContractSerializer时遇到问题,c#,.net,serialization,datacontractserializer,C#,.net,Serialization,Datacontractserializer,使用DataContractSerializer序列化不可变实例时遇到问题,因为我序列化的类上的属性缺少setter。问题是,我只想序列化实例(只是为了将其写入日志),而且我永远不需要对其进行反序列化。有没有办法绕过这种行为 我尝试序列化的类: [DataContract] public class Person { private readonly string _name; [DataMember] public string Name {
[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();
}
您可以将
[DataMember]
放在字段上,这样就可以拥有属性getter。这些字段仍然可以是私有的。但是,它不能是只读的,因为它需要构造对象,然后设置字段
[编辑]
这将导致使用字段名,除非您使用
[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);
}
}
非常感谢你。我应该在发布问题之前考虑到这一点。:)不知道这是否发生了变化,但在.net 4.5.1中,您可以序列化和反序列化只读字段