2010-09-20 73 views
1

我有兩個類A和B.A具有B的一個實例,當序列化A時,我希望B與A的級別相同而不是子元素。將類變量序列化爲xml而不創建新元素

所以我想生成的XML成爲

 
    <a> 
     <avalue>a</avalue> 
     <bvalue>b</bvalue> 
    </a> 

該計劃會將中的B它自己的元素作爲

 
    <a> 
     <avalue>a</avalue> 
     <b> 
     <bvalue>b</bvalue> 
     </b> 
    </a> 
public class A 
{ 
    public string avalue = "a"; 
    public B b = new B(); 
} 

public class B 
{ 
    public string bvalue = "b"; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var a = new A(); 
     var xml = new XmlSerializer(a.GetType()); 
     xml.Serialize(new StreamWriter(@"c:\temp\tmp.xml"), a); 
    } 
} 

PS:這個必須已經問過,但我我不知道要搜索什麼。我的谷歌福變成了空......

編輯:

,我希望避免「包裝」解決方案,如果可能的:你需要做B房產和標記

public class A 
{ 
    public string avalue = "a"; 

    [XmlIgnore] 
    public B b { get; set; } 

    [XmlElement("bvalue")] 
    public string bvalue 
    { 
     get { return b.bvalue; } 
     set { b.bvalue = value; } 
    } 
} 

回答

0

它與XMLAttribute。

+0

看起來不起作用:「XmlAttribute/XmlText不能用於編碼複雜類型」 – simendsjo 2010-09-20 11:23:20

0

Arseny的答案是正確的,雖然這是一個有點曖昧,所以這裏是需要改變什麼:

public class B 
{ 
     [XmlAttribute] 
     public string bvalue = "b"; 
} 

,並輸出:

<?xml version="1.0" encoding="utf-8"?> 
<A> 
    <avalue>a</avalue> 
    <b bvalue="b" /> 
</A> 

希望這是你想要的。

+0

沒有。我不想作爲avalue以下的元素來評價。我可以通過創建一個包裝器來解決這個問題,如果必須的話,它會使結構變平坦,但我寧願不要:) – simendsjo 2010-09-20 11:27:01

+0

@Simpzon:是的,我知道這是可能的,但是沒有任何方法將子類元素注入到家長嗎? – simendsjo 2010-09-20 11:31:25

+0

@simendsjo:我已經刪除了這條評論,因爲在第二期看來它似乎沒有幫助任何人。我不認爲你想獲得的東西有一個標準的方式,但我不是這方面的專家。 – 2010-09-27 07:43:08