2013-03-06 9 views
25

Mono For Androidアプリケーションでデータをシリアライズし、WCFを使用してリスンしている.NETサーバーにRESTを使用して送信しています。しかし、これまでのところ、この特定のデータコントラクトでは正常に動作しましたが、サーバでエラーが発生しなくても、データコントラクト内のリストは空になります。DataContractSerializerの出力が.NETとMonoで異なる

Fiddlerを使用して同じコードで2つのプロジェクトを作成すると、.NET DataContractSerializerの標準出力とMonoの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> 

モノ出力:フィドラーとテストの提出を使ってXMLを微調整

<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> 

、私は_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が名前を自動的に解決するためにReflectionを使用していると思われます。最後にX8I0_S_SPUを追加していますが、Monoは最後ではありません。

DataContractAttributeに名前パラメータを追加することもできます。[DataContract(Name = "IdentityDataReference")]は生成された名前をオーバーライドしてIdentityDataReferenceになります。指定したときにOf型を追加しようとしません。

残念ながら、名前を指定してデータをデシリアライズしようとすると、Monoがランタイム例外を被っていることを簡単なテストで確認できます。

私はこの問題をよりよく理解したので、問題を再現する独立したプロジェクトを作成しようとしています。

編集 - マーキング解決として:

私は今、何年も前にこのプロジェクトからの移動が、私は同じ問題に遭遇今日同じように感じるであろうからKatulusによって答えとしてこれを閉鎖することを決めました。 WCFの既存のサービスに余計な労力をかけずに無駄のないプラットフォーム間の統合を無償で行うことができた時、私たちの希望でした。

今日、同じ要件が提示されたら、私は代わりに、よりクロスプラットフォームのフレンドリーな通信プロトコルを選択します。既存のWCFインフラストラクチャを置き換えることができない場合は、facadeおよび/またはadapter(おそらく別のソリューション)を作成します.JAPONシリアル化を使用してWebAPIなどのサービスを公開し、バックグラウンド。

+5

これがバグであることが判明した場合は、Xamarin(https://bugzilla.xamarin.com/)に報告できます。 – Dandy

+3

同じ問題が発生しました。 Xamarinは.NETのようにジェネリック型のデータコントラクト名にハッシュを追加していません。この問題を回避するには、複数のプラットフォームをサポートしていて名前を変更できなかったため、DataContractResolverを使用しました。名前の衝突の可能性があるため、[DataContract(Name = "IdentityDataReferenceOf {0}")] ' –

+0

モノを使用してサービスアプリケーションをコンパイルする理由は何ですか?私はあなたがそれをしたと思います。 – danish

答えて

3

です。このバグだけではない他の可能性のある問題があります。たとえば、サーバー上のクラスを変更すると、すべてのクライアントが停止し、その逆もあります。両面を完全に制御できないサーバー/クライアントのシナリオでは、これは大きな問題になります。

私はDataContractSerializerをXmlSerializerに変更し、両者をより良くコントロールできます。また、XMLとの間で独自のシリアライゼーションを実装して、将来のアップグレードを考慮に入れることもできます。 1つのサーバーに新しいプロパティを追加すると、その古いプロパティに新しいプロパティが存在しない場合に処理できるように、デシリアライザを更新できます。

+0

したがって、私たちは常に、夜間のビルド中に自動的にデータ転送オブジェクト(DTO)の再生成を実装します。サービスは、クライアントがプロキシを再生成するために使用する契約をエクスポートし、サービスとクライアントの両方が同じXSDからDTOを生成します。 Contract First Developmentと呼ぶもの。 – riezebosch

0

おそらく回避策は、svcutilアプリケーションを使用してプロキシを生成し、次に同じプロキシをそのまま使用することです。 http://tutorials.csharp-online.net/WCF_Essentials%E2%80%94Generating_the_Proxy

は、一般的に私はそれを参照バージョンの問題を特定する数回私を助けたとして、あなたは、のDataContractの名前空間の使用を開始すべきだと思う、それはコードがためにプロキシを使用して実行されているバージョン持っているだけでとてもうれしいです。しかしそれは別の使い方です:)

おそらくリファレンスを作成するときに、インタフェースを保持するパブリックライブラリへの参照を追加できる場合は、サービス参照設定の '参照されたアセンブリの再利用タイプ'を使用して、独自の型を同じ拡張にする。

最後に、サービス参照の下にReference.svcmapのすべてのファイルが表示されます。このXMLには、リストが動作するように指定するために必要な「CollectionMappings」要素が含まれています。この記事では、 :
http://social.msdn.microsoft.com/Forums/vstudio/en-US/09eefbbc-bf63-4aa3-a0cb-01a9dbd7f496/problem-sharing-custom-collection-types-between-service-and-client

あなたは、異なるプラットフォーム(.NETとMonoが同じになるようにしようとしていても)との間で通信している場合は、DataContractSerializerを使用しないでくださいヒントをデバッグするの私の5セント、
乾杯

関連する問題