以编程方式设置要从序列化中排除的属性
是否可以以编程方式设置要从序列化中排除属性?
例:
- 反序列化时,我想加载一个ID字段
- 序列化时,我想不输出ID字段
我相信这里有三个选择:
-
使用XmlIgnore属性。 缺点是您需要事先知道xmlserializer要忽略哪些属性。
-
实现IXmlSerializable接口。 这使您可以完全控制XML的输出,但您需要自己实现读/写方法。
-
实现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]
属性。 否则,如何忽略特定属性由序列化程序本身定义。
NonSerializedAttribute属性。
http://msdn.microsoft.com/en-us/library/system.nonserializedattribute.aspx