2010-09-08 73 views
5

我想從svcutil序列化/反序列化生成的WCF Web服務代理代碼。雖然我能夠序列化對象,但我無法將它們反序列化回對象。下面是我通過序列化生成的XML:我已經使用XmlSerializerNamespaces聲明命名空間來匹配生成的代理代碼中指定的命名空間如何序列化/反序列化生成的WCF代理代碼?

  1. <RootObject xmlns="http://schemas.myco.com/online/sync/2008/11"> 
        <WrapperObject> 
         <Objects> 
          <SomeObject p4:type="Foo" ContextId="d5f9f021-b2a1-47ba-9f25-1e068194dc87" ObjectId="fad3ef87-3944-459d-b45b-1e4e52ef24db" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.myco.com/online/sync/2008/11" /> 
         </Objects> 
         </WrapperObject> 
    </RootObject> 
    

    我有幾個問題。爲什麼還會有一個「p4」標籤添加到「SomeObject」標籤並添加了新的xml名稱空間(xmlns:p4 =「http://www.w3.org/2001/XMLSchema-instance」)。

    using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, xmlSettings)) 
        { 
         XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
         namespaces.Add(string.Empty, defaultNamespace); 
    
         XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace); 
         serializer.Serialize(xmlWriter, objectToBeSerialized, namespaces); 
    
         return stringBuilder.ToString(); 
        } 
    
  2. 當我嘗試用下面的代碼反序列化的XML,我得到以下錯誤:「System.InvalidOperationException:有一個錯誤生成XML文檔---> System.Xml.XmlException: 'p4:type'是重複的屬性名稱。「

    using (TextReader textReader = new StringReader(xmlString)) 
        { 
         using (XmlReader xmlReader = XmlReader.Create(textReader)) 
         { 
          XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace); 
          return (T)serializer.Deserialize(xmlReader); 
         } 
        } 
    
  3. 代理代碼由SvcUtil工具生成具有WCF web服務進行通信。當我只使用Web服務調用時,所有生成的對象都被正確序列化/反序列化。

有沒有人有過類似的問題?

回答

4

WCF使用專用的XML序列化器來序列化將從標準的XmlSerializer產生不同的XML的對象。你可以使用XmlSerializer,但是你必須正確地爲你的類賦予objectToBeSerialized對象的屬性。可能更好的是使用WCF序列化器。

看看這篇文章:

http://msdn.microsoft.com/en-us/magazine/cc163569.aspx