2017-04-05 86 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(); 

}