C# 使用DataContractSerializer时遇到问题

C# 使用DataContractSerializer时遇到问题,c#,.net,serialization,datacontractserializer,C#,.net,Serialization,Datacontractserializer,使用DataContractSerializer序列化不可变实例时遇到问题,因为我序列化的类上的属性缺少setter。问题是,我只想序列化实例(只是为了将其写入日志),而且我永远不需要对其进行反序列化。有没有办法绕过这种行为 我尝试序列化的类: [DataContract] public class Person { private readonly string _name; [DataMember] public string Name {

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

您可以将
[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中,您可以序列化和反序列化只读字段