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

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

例:

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

我相信这里有三个选择:

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

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

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

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

您可以使用OnDeserializedAttribute :

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

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

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

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

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

如:

 class SomeClass { [XmlIgnore] int someID; public string someString; } 

如果要在序列化期间包含字段但在反序列化期间忽略它,则可以使用OnDeserializedAttribute运行将为ID字段设置默认值的方法。

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

如果您正在使用XML序列化,请使用[XmlIgnore]属性。 否则,如何忽略特定属性由序列化程序本身定义。