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

时间:2010-06-10 18:13:16

标签: c# serialization

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

示例:

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

7 个答案:

答案 0 :(得分:18)

我相信这里有三个选择:

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

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

  3. 实施ICustomTypeDescriptor界面。我相信无论您选择何种类型的序列化,这都将使您的解决方案工作,但它可能是所有类型中最长的解决方案。

答案 1 :(得分:16)

这取决于序列化类型。这是使用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关于序列化的文章:part 1part 2

答案 2 :(得分:5)

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

如:

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分:1)