【问题标题】:How to prevent changes in serialized class after serialization序列化后如何防止序列化类发生变化
【发布时间】:2012-01-16 06:43:44
【问题描述】:

我有这门课:

[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;
}

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

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

【问题讨论】:

    标签: c# serialization immutability xmlserializer


    【解决方案1】:

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

    另外,您不需要为 XML 序列化指定 [Serializable] 属性。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        相关资源
        最近更新 更多