2015-09-01 27 views
1

我有一個xsd文件,由外部公司定義,我使用xsd.exe生成類。我可以使用提供的xml文件來反序列化使用生成的類的對象,但是在少數情況下,我需要將xml的較小部分作爲XDocument。我不知道這些部分,直到運行時的路徑,所以我使用XML爲:如何獲取序列化對象與原始源XML文件相同?

XElement element = xml.XPathSelectElement(path); 

我有是序列化的結果不匹配傳入的XML完全正確的問題,這使得select返回null。我如何獲得一個序列化的對象看起來像傳入的文件?我可能使用xsd.exe錯誤地生成類嗎?我最終需要使用相同的生成代碼來生成我自己的XML文件。

這裏是我目前使用序列化

var xml = new XDocument(); 
using (var writer = xml.CreateWriter()) 
{ 
    List<Type> known = new List<Type>(); 
    known.Add(typeof(ObjType1)); 
    ... 
    var serializer = new DataContractSerializer(typeof(Detail), known); 
    serializer.WriteObject(writer, sourceDetailObj); 
} 

串行化結果代碼:

<Detail xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CustomNameSpace"> 
    ... 
    <numberField>1</numberField> 
    <detailTypeField> 
     <objField i:type="ObjType1"> 
      <valObjField i:nil="true" /> 
      ... 
     </objField> 
    </detailTypeField> 
    ... 
</Detail> 

它應該是什麼樣子:

<Detail> 
    ... 
    <Number>1</Number> 
    <DetailType> 
     <ObjType1> 
      ... 
     </ObjType1> 
    </DetailType> 
    ... 
</Detail> 

這裏的課程之一xsd生成:

public partial class DetailType { 

    private object objField; 

    [System.Xml.Serialization.XmlElementAttribute("ObjType1", typeof(ObjType1))] 
    ... 
    public object Obj { 
     get { 
      return this.objField; 
     } 
     set { 
      this.objField = value; 
     } 
    } 
} 

Obj可以是幾個類之一。

+2

快速嘗試(如果你還沒有)是使用'XmlSerializer'而不是'DataContractSerializer',看看是否解決了你的問題。它們不一定產生相同的輸出。 – DeanOC

+0

@DeanOC是的,解決了它!這產生了與源文件幾乎完全相同的xml。 – matt

+0

很酷。我將添加它作爲答案。 – DeanOC

回答

1

使用DataContractSerializer的問題在於,它針對在WCF服務之間發送消息進行了優化,並不一定產生與XmlSerializer相同的「經典」xml。

特別是,XmlSerializer會序列化所有公共成員,除非你不告訴它,但對於DataContractSerializer它不會序列化,除非你告訴它。這樣做是爲了幫助WCF更快;你只會得到你所要求的。

因此,如果您沒有爲WCF服務生成XML,我建議您改用XmlSerialiser

相關問題