2013-03-06 78 views
25

我序列化的數據在單對於Android應用程序,並使用REST .NET服務器使用WCF監聽發送它之間是不同的。到目前爲止,這一切都很好,但是,對於這個特定的數據合同,雖然服務器沒有發生錯誤,但數據合同中的列表顯示爲空。輸出.NET和Mono

使用招和創建代碼相同的兩個項目,我能夠比較與Mono的實施DataContractSerializer的輸出正常.NET DataContractSerializer的輸出。

.NET輸出:

<VisitDataContractEx xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts"> 
    <_isDirty xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">true</_isDirty> 
    <_id xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.Domain" xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:internalValue>a7b97b48-d3a9-419d-9f4e-330ffc7a01ee</d2p1:internalValue> 
    </_id> 
    <_key xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">false</_key> 
    <_keyIdentifier xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">SurrogateKey</_keyIdentifier> 
    <ChecklistComplete>false</ChecklistComplete> 
    <Date>2013-03-05T15:43:49.5008406+02:00</Date> 
    <GpsAccuracy>1</GpsAccuracy> 
    <GpsLatitude>1</GpsLatitude> 
    <GpsLongitude>1</GpsLongitude> 
    <OrderComplete>false</OrderComplete> 
    <PhotoComplete>false</PhotoComplete> 
    <StockComplete>false</StockComplete> 
    <Sync>2013-03-05T15:43:49.5468406+02:00</Sync> 
    <checkListAnswers xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_list> 
     <d2p1:IdentityDataReferenceOfCheckListAnswerDataContractExX8I0_S_SPU> 
     <d2p1:_dataContract z:Id="i2"> 
      <d2p1:_isDirty>true</d2p1:_isDirty> 
      <d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d6p1:internalValue>95ae919b-a389-4ea7-a009-af1b91890c36</d6p1:internalValue> 
      </d2p1:_id> 
      <d2p1:_key>false</d2p1:_key> 
      <d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier> 
      <Answer>false</Answer> 
      <checkListQuestion> 
      <d2p1:_dataContract i:nil="true" /> 
      <d2p1:_description i:nil="true" /> 
      <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
      <d2p1:_id xmlns:d7p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
       <d7p1:internalValue>176cbb31-7df2-4966-baa9-4e3cd2a0c6d5</d7p1:internalValue> 
      </d2p1:_id> 
      </checkListQuestion> 
     </d2p1:_dataContract> 
     <d2p1:_description i:nil="true" /> 
     <d2p1:_hasDataContract>true</d2p1:_hasDataContract> 
     <d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d5p1:internalValue>95ae919b-a389-4ea7-a009-af1b91890c36</d5p1:internalValue> 
     </d2p1:_id> 
     </d2p1:IdentityDataReferenceOfCheckListAnswerDataContractExX8I0_S_SPU> 
    </d2p1:_list> 
    </checkListAnswers> 
    <comments xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_list /> 
    </comments> 
    <directSalesAgent xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_dataContract i:nil="true" /> 
    <d2p1:_description i:nil="true" /> 
    <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
    <d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
     <d3p1:internalValue>6f99f86a-5b1b-4f73-bdc3-388e0b7cf417</d3p1:internalValue> 
    </d2p1:_id> 
    </directSalesAgent> 
    <directSalesAgentSuperVisor xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_dataContract i:nil="true" /> 
    <d2p1:_description i:nil="true" /> 
    <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
    <d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
     <d3p1:internalValue>d57db20d-9b3a-4345-849e-d5a0d0d88f70</d3p1:internalValue> 
    </d2p1:_id> 
    </directSalesAgentSuperVisor> 
    <photos xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_list> 
     <d2p1:IdentityDataReferenceOfPhotoDataContractExX8I0_S_SPU> 
     <d2p1:_dataContract z:Id="i3"> 
      <d2p1:_isDirty>true</d2p1:_isDirty> 
      <d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d6p1:internalValue>3db431e9-3338-4c96-aea9-d833eb0dc8ae</d6p1:internalValue> 
      </d2p1:_id> 
      <d2p1:_key>false</d2p1:_key> 
      <d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier> 
      <Content i:nil="true" /> 
      <Taken>2013-03-05T15:43:49.4748406+02:00</Taken> 
     </d2p1:_dataContract> 
     <d2p1:_description i:nil="true" /> 
     <d2p1:_hasDataContract>true</d2p1:_hasDataContract> 
     <d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d5p1:internalValue>3db431e9-3338-4c96-aea9-d833eb0dc8ae</d5p1:internalValue> 
     </d2p1:_id> 
     </d2p1:IdentityDataReferenceOfPhotoDataContractExX8I0_S_SPU> 
    </d2p1:_list> 
    </photos> 
    <salesPoint xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_dataContract i:nil="true" /> 
    <d2p1:_description i:nil="true" /> 
    <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
    <d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
     <d3p1:internalValue>692a294a-2d1b-4026-9693-0c0ce552a2fb</d3p1:internalValue> 
    </d2p1:_id> 
    </salesPoint> 
    <stockCounts xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts" i:nil="true" /> 
</VisitDataContractEx> 

單聲道輸出:

<VisitDataContractEx xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts"> 
    <_isDirty xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">true</_isDirty> 
    <_id xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.Domain" xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:internalValue>9297eea9-82af-4981-ab9d-40aa0ac0fa0d</d2p1:internalValue> 
    </_id> 
    <_key xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">false</_key> 
    <_keyIdentifier xmlns="http://schemas.datacontract.org/2004/07/Organization.DataContracts">SurrogateKey</_keyIdentifier> 
    <ChecklistComplete>false</ChecklistComplete> 
    <Date>2013-03-05T17:49:06.362243+02:00</Date> 
    <GpsAccuracy>1</GpsAccuracy> 
    <GpsLatitude>1</GpsLatitude> 
    <GpsLongitude>1</GpsLongitude> 
    <OrderComplete>false</OrderComplete> 
    <PhotoComplete>false</PhotoComplete> 
    <StockComplete>false</StockComplete> 
    <Sync>2013-03-05T17:49:06.438934+02:00</Sync> 
    <checkListAnswers xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_list> 
     <d2p1:IdentityDataReferenceOfCheckListAnswerDataContractEx> 
     <d2p1:_dataContract xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" z:Id="i2"> 
      <d2p1:_isDirty>true</d2p1:_isDirty> 
      <d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d6p1:internalValue>75083457-9714-4971-b60c-f28fa43167ad</d6p1:internalValue> 
      </d2p1:_id> 
      <d2p1:_key>false</d2p1:_key> 
      <d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier> 
      <Answer>false</Answer> 
      <checkListQuestion xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
      <d6p1:_dataContract xmlns:d7p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" /> 
      <d6p1:_description i:nil="true" /> 
      <d6p1:_hasDataContract>false</d6p1:_hasDataContract> 
      <d6p1:_id xmlns:d7p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
       <d7p1:internalValue>176cbb31-7df2-4966-baa9-4e3cd2a0c6d5</d7p1:internalValue> 
      </d6p1:_id> 
      </checkListQuestion> 
     </d2p1:_dataContract> 
     <d2p1:_description i:nil="true" /> 
     <d2p1:_hasDataContract>true</d2p1:_hasDataContract> 
     <d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d5p1:internalValue>75083457-9714-4971-b60c-f28fa43167ad</d5p1:internalValue> 
     </d2p1:_id> 
     </d2p1:IdentityDataReferenceOfCheckListAnswerDataContractEx> 
    </d2p1:_list> 
    </checkListAnswers> 
    <comments xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_list /> 
    </comments> 
    <directSalesAgent xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_dataContract xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" /> 
    <d2p1:_description i:nil="true" /> 
    <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
    <d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
     <d3p1:internalValue>6f99f86a-5b1b-4f73-bdc3-388e0b7cf417</d3p1:internalValue> 
    </d2p1:_id> 
    </directSalesAgent> 
    <directSalesAgentSuperVisor xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_dataContract xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" /> 
    <d2p1:_description i:nil="true" /> 
    <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
    <d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
     <d3p1:internalValue>d57db20d-9b3a-4345-849e-d5a0d0d88f70</d3p1:internalValue> 
    </d2p1:_id> 
    </directSalesAgentSuperVisor> 
    <photos xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_list> 
     <d2p1:IdentityDataReferenceOfPhotoDataContractEx> 
     <d2p1:_dataContract xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" z:Id="i3"> 
      <d2p1:_isDirty>true</d2p1:_isDirty> 
      <d2p1:_id xmlns:d6p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d6p1:internalValue>507f45d1-ce3a-4ec2-a343-d0b83cfb7bc8</d6p1:internalValue> 
      </d2p1:_id> 
      <d2p1:_key>false</d2p1:_key> 
      <d2p1:_keyIdentifier>SurrogateKey</d2p1:_keyIdentifier> 
      <Content i:nil="true" /> 
      <Taken>2013-03-05T17:49:06.294006+02:00</Taken> 
     </d2p1:_dataContract> 
     <d2p1:_description i:nil="true" /> 
     <d2p1:_hasDataContract>true</d2p1:_hasDataContract> 
     <d2p1:_id xmlns:d5p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
      <d5p1:internalValue>507f45d1-ce3a-4ec2-a343-d0b83cfb7bc8</d5p1:internalValue> 
     </d2p1:_id> 
     </d2p1:IdentityDataReferenceOfPhotoDataContractEx> 
    </d2p1:_list> 
    </photos> 
    <salesPoint xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts"> 
    <d2p1:_dataContract xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Project.DataContracts" i:nil="true" /> 
    <d2p1:_description i:nil="true" /> 
    <d2p1:_hasDataContract>false</d2p1:_hasDataContract> 
    <d2p1:_id xmlns:d3p1="http://schemas.datacontract.org/2004/07/Organization.Domain"> 
     <d3p1:internalValue>692a294a-2d1b-4026-9693-0c0ce552a2fb</d3p1:internalValue> 
    </d2p1:_id> 
    </salesPoint> 
    <stockCounts xmlns:d2p1="http://schemas.datacontract.org/2004/07/Organization.DataContracts" i:nil="true" /> 
</VisitDataContractEx> 

調整使用招和測試提交的XML,我已經_list下縮小問題的元素名稱元素:

.NET:

<d2p1:_list> 
     <d2p1:IdentityDataReferenceOfCheckListAnswerDataContractExX8I0_S_SPU> 

單聲道:

<d2p1:_list> 
     <d2p1:IdentityDataReferenceOfCheckListAnswerDataContractEx> 

這是我的代碼序列化數據:

public string Serialize<TDataContract>(object obj) 
{ 
    var builder = new StringBuilder(); 
    var serializer = new DataContractSerializer(typeof(TDataContract)); 
    var xmlWriter = XmlWriter.Create(builder); 
    serializer.WriteObject(xmlWriter, obj); 
    xmlWriter.Close(); 

    return builder.ToString().Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>", string.Empty); 
} 

這是其必須由得到解決的錯誤單聲道團隊,還是可以有人建議一種可能的解決方法?

編輯:

我一直在下降進一步縮小這個問題,它不是關於列表,它是關於每個實現選擇XML元素名稱的方式。

IdentityDataReference是一個通用類型,在這種情況下它的類型爲CheckListAnswerDataContractEx

IdentityDataReference也恰好在分佈式DLL(我有源代碼),所以我懷疑DataContractSerializer是使用反射來自動計算出名稱,也許因爲它是一個單獨分佈的DLL,.NET最後加上X8I0_S_SPU,但是,單聲道不是。

我還發現,我可以添加一個名字paramater到DataContractAttribute像這樣:[DataContract(Name = "IdentityDataReference")]這將覆蓋生成的名字只是IdentityDataReference,它指定時甚至沒有嘗試添加的類型。

不幸的是,快速測試顯示單正遭受運行時異常時,我指定名稱和它試圖反序列化數據。

現在我明白了這個問題好,我試圖讓一個孤立的項目,該項目複製的問題。

編輯 - 標記爲已解決:

我從這個項目很多年前搬到現在,但決定Katulus作爲回答,因爲我會覺得今天同樣遇到了同樣的問題,關閉此。當時我們希望我們能夠實現「免費」的無痛平臺間整合,而不需要額外的工作來完成現有的WCF服務,而這種服務實際上是天真的。

今天如果提出相同的要求,我會選擇一個更多的跨平臺友好的通信協議。如果我無法替換現有的WCF基礎結構,那麼我會創建某種類型的facade和/或adapter(可能位於不同的解決方案中),該服務通過使用JSON序列化的WebAPI等方式公開服務,與原始WCF服務背景。

+5

如果您發現這是一個錯誤,您可以通過https://bugzilla.xamarin.com/將其報告給Xamarin。 – Dandy 2013-03-12 22:20:50

+3

我們已經看到相同的問題。 Xamarin不像.NET那樣爲泛型類型的數據協定名稱添加哈希。我們的解決方法是使用DataContractResolver,因爲我們支持多個平臺並且無法修改名稱,例如。由於名稱衝突的可能性,[DataContract(Name =「IdentityDataReferenceOf {0}」)]'。 – 2013-09-03 22:51:44

+0

你爲什麼要使用mono編譯服​​務應用程序?我想你是這麼做的。 – danish 2013-12-22 19:10:46

回答

3

如果您在不同的平臺之間的通信(儘管.NET和Mono嘗試是相同的),你應該避免使用的DataContractSerializer。除此錯誤外,還有其他可能的問題。如果您例如更改服務器上的類,則所有客戶端可能停止工作,反之亦然。在沒有完全控制雙方的服務器 - 客戶端場景中,這可能是一個大問題。

我會將DataContractSerializer更改爲XmlSerializer,您可以更好地控制雙方。甚至可以在XML中實現自己的序列化,並且可以在將來進行升級。如果您在一臺服務器上添加了一些新的屬性,那麼您可以通過它可以處理的方式更新您的反序列化器,如果新的屬性從某個舊客戶端丟失的話。

+0

因此,我們總是在夜間構建過程中自動重新生成數據傳輸對象(DTO)。該服務導出其客戶用於重新生成其代理的合同,並且服務和客戶端都從同一個XSD生成DTO。我們稱之爲契約第一發展。 – riezebosch 2014-01-03 15:03:18