2017-04-05 74 views
1

我想制定出序列化嵌套類而不必序列化整個嵌套類成員的最佳方法。假設以下類:嵌套類成員序列化

public class ClassA 
{ 
    public decimal ID { get; set; } 
} 

public class ClassA1 : ClassA 
{ 
    public decimal Name { get; set; } 
    public decimal Value { get; set; } 
    public decimal Description { get; set; } 
} 

public class ClassA2 : ClassA 
{ 
    public ClassA1 Details { get; set; } 
    public int SomeValue { get; set; } 
} 

我有一個類型爲ClassA1的對象的固定列表存儲在類型爲List的變量中。

我也有存儲類型列表中

的變量類型ClassA2的對象列表,我想什麼做的是序列化和反序列化我ClassA2對象列表。自動序列化將序列化每個ClassA1對象的全部內容,但我只想序列化並反序列化ClassA1.ID成員,然後在反序列化時從我的固定列表中檢索對象引用。

自動序列使我這個:

... 
<ClassA2> 
    <ID>IDStringForObjectClassA2</ID> 
    <Details> 
    <ClassA1> 
     <ID>IDStringForObjectOfClassA1</ID> 
     <Name>MyNameValue</Name> 
     <Value>MyStringValue</Value> 
     <Description>MyDescriptionValue</Description> 
    </ClassA1> 
    </Details> 
    <SomeValue>0</SomeValue> 
</ClassA2> 

最終的結果我想在我的XML是這個

... 
<ClassA2> 
    <ID>IDStringForObjectClassA2</ID> 
    <Details> 
    <ClassA1> 
     <ID>IDStringForObjectOfClassA1</ID> 
    </ClassA1> 
    </Details> 
    <SomeValue>0</SomeValue> 
</ClassA2> 

,並在ClassA1.ID成員的反序列化,我想在預加載列表中找到實際對象

編輯:文檔s下面

public class Document 
{ 
    private _ClassA2; 

    public Document() { _ClassA2 = null; } 

    public ClassA2 ClassA2 
    { 
    get { return _ClassA2; } 
    set { _ClassA2 = value; } 
    } 

    public string Serialize(StreamWriter writer) 
    { 
    var serializer = new XmlSerializer(typeof(ClassA2)); 
    serializer.Serialize(writer, this); 
    return writer.ToString(); 
    } 

    public static ClassA2 DeSerialize(StreamReader reader) 
    { 
    var serializer = new XmlSerializer(typeof(ClassA2)); 
    ClassA2 value = serializer.Deserialize(reader) as ClassA2 ; 
    return value; 
    } 
} 
+0

您用於反序列化的當前代碼是什麼? – RBT

+0

根據您提到的類,您的XML無法用於反序列化。 'Details'標籤裏面應該有'ClassA1'標籤。 'ClassA2'也沒有結束標籤。 – RBT

+0

@RBT我使用標準XmlSerializer類反序列化 反正是有上述納入這個或做我必須改變,以完全自定義的反序列化 'VAR串行=新的XmlSerializer(typeof運算(CableDocument));' 'CableDocument value = serializer。反序列化(閱讀器)爲CableDocument;' 編輯:對於我的生活,我無法正確地在上面工作markdown – Woodjitsu

回答

2

erializer類要排除元件,既可以在同一個類定義「ShouldSerialize」方法作爲數據:

public bool ShouldSerializeDescription() 
{ 
    return false; 
} 

public decimal Description { get; set; } 

或使用屬性上述[XmlIgnore]屬性:

[XmlIgnore] 
public decimal Description { get; set; } 

在大多數情況下,我會推薦XmlIgnore。

關於查找成員來填充字段,根據我所知,沒有任何內容可以實現此目的。您只需循環並手動定位值。有關更多信息,請參閱this post

+0

John, 我沒有使用XmlIgnore或ShouldSerialize的原因是因爲ClassA1單獨序列化,需要這些字段序列化。我遇到的問題是序列化包含嵌套類的類。 主類(ClassA2)只需要對ID進行序列化和反序列化,以便引用嵌套類的成員變量可以引用適當的ClassA1對象一個單獨的反序列化對象列表。 – Woodjitsu

+1

提供的鏈接似乎引用了我想要實現的內容,所以我會查看該線程中提供的選項。 – Woodjitsu

1

我改變了一些輸入XMl,這些XMl被序列化成一個有效的XML。請參閱下面的代碼,該代碼僅對Details屬性中的ID屬性ClassA1進行反序列化。您將不得不在代碼文件的頂部使用以下導入using System.Xml.Linq;

private static void NestedMemberSerialization() 
{ 

    var serializedXml = "<ClassA2><ID>1</ID><Details><ClassA1><ID>2</ID><Name>4</Name><Value>2</Value><Description>3</Description></ClassA1></Details><SomeValue>2</SomeValue></ClassA2>"; 

    XDocument doc = XDocument.Parse(serializedXml); 

    var mySteps = (from s in doc.Descendants("ClassA2") 
        select new ClassA2 
        { 
         ID = decimal.Parse(s.Element("ID").Value), 
         SomeValue = int.Parse(s.Element("SomeValue").Value), 
         Details = new ClassA1 { ID = decimal.Parse(s.Element("Details").Descendants("ClassA1").Descendants("ID").ElementAt(0).Value) } 
        }).ToList(); 

}