使用DataContractSerializer时遇到问题

时间:2010-06-29 07:12:18

标签: c# .net serialization datacontractserializer

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

2 个答案:

答案 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);
    }
}