2017-03-22 13 views
0

我有一個類,它包含的XElement對象的屬性...序列化的XElement是一個類對象

public class SomeClass 
{ 
    public string prop1 = ""; 
    public string prop2 = ""; 
    public XElement elem = null; 
} 

我與實例後設置的XElement屬性代碼另一個內部定義的類的對象......

UserFields userFields = new UserFields(); 
SomeClass sc = new SomeClass(); 
sc.prop1 = "Sam"; 
sc.prop2 = "Smith"; 
sc.elem = new XElement("UserFields", userFields); 

的問題是,當我使用XmlSerializer的序列化類對象到XML,我只爲SomeClass.elem屬性得到完全合格的類名...

StringWriter sw = new StringWriter(); 
XmlSerializer x = new XmlSerializer(o.GetType()); 
x.Serialize(sw, o); 
string xmlString = sw.ToString(); 

我得到這個作爲輸出...

<SomeClass> 
    <prop1>Sam</prop1> 
    <prop2>Smith</prop2> 
    <elem>MyNamespace.UserFields</elem> 
</SomeClass> 

好像XmlSerializer的不知道什麼相當與的XElement對象做。我想找到一種方法將XML從XElement對象序列化爲XML字符串,就像正在發生的其他類對象一樣。有任何想法嗎?

+1

是否應用'[XmlAnyElement將]'標籤到'elem'屬性,產生所需的輸出? – Xiaoy312

+0

['[XmlAnyElement]'](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlanyelementattribute.aspx)將完成這項工作,請參閱[本答案](http: //stackoverflow.com/a/30278016/3744182)。 – dbc

回答

0

好的我找到了我的答案。問題不在序列化中,而是在類對象的XElement賦值中。由於類對象是一個像在任何C#項目中定義的普通工藝類,所以對XElement的賦值是調用對象的ToString()方法,該方法返回完全限定的類名(這是出現的內容)對象被序列化爲XML之後)。 XElement需要分配簡單類型或其他X類型。在我的情況下,以下完成將所有類的屬性添加到XElement和後來的序列化按預期工作。 [XmlAnyElement]屬性不是必需的。

List<XElement> items = new List<XElement>(); 
FieldInfo[] fields = typeof(UserFields).GetFields(); 
foreach (FieldInfo fld in fields) 
    items.Add(new XElement(fld.Name, fld.GetValue(userFields.Content))); 
sc.elem = new XElement("UserFields", items); 

這將返回類似下面的...

<Root> 
    <SomeField>the value</SomeField> 
    ... 
    <UserFields> <-- this section is what is generated from the list of XElement objects 
     <UserField1>value1</UserField1> 
     ... 
     <UserFieldN>valueN</UserFieldN> 
    </UserFields> 
</Root>