以编程方式设置要从序列化中排除的属性

Pau*_*aul 11 c# serialization

是否可以以编程方式设置要从序列化中排除属性?

例:

  • 反序列化时,我想加载一个ID字段
  • 序列化时,我想不输出ID字段

Ana*_*nax 19

我相信这里有三个选择:

  1. 使用XmlIgnore属性.缺点是您需要事先知道xmlserializer要忽略哪些属性.

  2. 实现IXmlSerializable接口.这使您可以完全控制XML的输出,但您需要自己实现读/写方法.

  3. 实现ICustomTypeDescriptor接口.我相信无论您选择何种类型的序列化,这都将使您的解决方案工作,但它可能是最长的解决方案.

 


Ser*_*kov 17

这取决于序列化类型.这里使用BinaryFormatter执行此操作的完整示例:

您可以使用OnDeserializedAttribute:

[Serializable]
class SerializableEntity
{
  [OnDeserialized]
  private void OnDeserialized()
  {
    id = RetrieveId();
  }

  private int RetrievId() {}

  [NonSerialized]
  private int id;
}
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以使用IDeserializationCallback来做到这一点:

[Serializable]
class SerializableEntity: IDeserializationCallback 
{
  void IDeserializationCallback.OnDeserialization(Object sender) 
  {
    id = RetrieveId();
  }

  private int RetrievId() {}

  [NonSerialized]
  private int id;
}
Run Code Online (Sandbox Code Playgroud)

您也可以阅读Jeffrey Richter关于序列化的文章:第1 部分第2部分.


Ser*_*pth 5

如果要序列化为XML,则可以使用XMLIgnore

如:

class SomeClass
{
  [XmlIgnore] int someID;
  public string someString;
}
Run Code Online (Sandbox Code Playgroud)

  • ...和NonSerialized属性,如果您正在使用BinaryFormatter或SoapFormatter. (2认同)

小智 5

一个旧帖子,但我发现了 ShouldSerialize 模式 http://msdn.microsoft.com/en-us/library/53b8022e%28VS.71%29.aspx这真的很有帮助!!!