2010-06-10 41 views
9

是否可以通過編程設置是否要從序列化中排除屬性?以編程方式設置要從序列化中排除的屬性

例子:

  • 當反序列化,我想加載一個ID字段
  • 序列化的時候,我想不輸出ID字段
+0

對於一個更好的答案,建議你明確你的序列化機制 - 例如XML序列化,數據合同序列化等 – Reddog 2010-06-10 18:22:49

回答

18

我認爲有三個選項的位置:

  1. 使用XmlIgnore屬性。缺點是您需要事先知道您希望xmlserializer忽略哪些屬性。

  2. 執行IXmlSerializable接口。這使您可以完全控制XML的輸出,但您需要自己實現讀取/寫入方法。

  3. 執行ICustomTypeDescriptor接口。我相信這會使您的解決方案無論您選擇什麼類型的序列化都能正常工作,但它可能是所有最長的解決方案。

 

5

如果您序列化到XML,您可以使用XMLIgnore

如:

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

...和NonSerialized屬性,如果您使用BinaryFormatter或SoapFormatter。 – Joe 2010-06-10 18:27:09

2

如果您使用XML序列化,請使用[XmlIgnore]屬性。否則,如何忽略一個特定的屬性是由序列化器本身定義的。

4

如果要在序列化期間包含字段,但在反序列化期間忽略它,則可以使用OnDeserializedAttribute來運行將爲ID字段設置默認值的方法。

14

這取決於序列類型。對於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; 
} 

而且關於序列化的文章:part 1part 2

+0

第一個給我麻煩,但第二個完美。 – Stoopkid 2014-08-22 04:45:44

相關問題