序列化后如何防止序列化类的更改

时间:2012-01-16 06:43:45

标签: c# serialization immutability xmlserializer

我有这堂课:

[Serializable]
public sealed class Broker
{
    public  int Id;
    public  string Name;
    public  string Hosts;
    public  string DefaultValidatorsNameSpace;
    public  string DefaultRendererNameSpace;
    public  bool IsDefault;
    public  CrmCredentials CrmCredentials;
}

当系统从xml文件通过XmlSerializer加载时,该类被反序列化。

我不想允许任何程序员在加载对象后更改对象的内容。一种方法是通过向每个项添加public get; private set;来使setter变为私有,但随后我将失去序列化功能。

2 个答案:

答案 0 :(得分:4)

您应该使用DataContractSerializer来序列化您的类,因为它不会将序列化仅限制为公共属性。

此外,您无需为XML序列化指定[Serializable]属性。

答案 1 :(得分:0)

YAXLib是一个XML序列化库,可让您序列化任何所需的字段。您不需要将序列化所需的字段公开给公共,您只需将选项设置为仅序列化属性字段。这是如何:

[YAXSerializableType(FieldsToSerialize=YAXSerializationFields.AttributedFieldsOnly)]
public sealed class Broker
{
    [YAXSerializableField]
    public  int Id { get; private set; }

    [YAXSerializableField]
    public  string Name { get; private set; }

    // or equaly give attribute to a private field
    [YAXSerializableField]
    private string _hosts;

    // and leave the property un-attributed
    public string Hosts { get { return _hosts; } }

}

有关详细信息,请参阅:

http://yaxlib.codeplex.com

http://www.codeproject.com/KB/XML/yaxlib.aspx