27

Mono For Android アプリケーションでデータをシリアル化し、WCF を使用してリッスンしている .NET サーバーに REST を使用して送信しています。これまでのところ、これはうまく機能していますが、この特定のデータ コントラクトでは、サーバーはエラーをスローしませんが、データ コントラクト内のリストは空として表示されます。

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>

モノラル出力:

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

Fiddler を使用して XML を微調整し、提出物をテストして、要素の下の要素名に問題を絞り込みました_list

。ネット:

    <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);
}

これは Mono チームが対処しなければならないバグですか、それとも回避策を提案してもらえますか?

編集:

私はこの問題をさらに絞り込んでいますが、それはリストに関するものではなく、各実装が XML 要素名を選択する方法に関するものです。

IdentityDataReferenceはジェネリック型を取り、この場合は typeCheckListAnswerDataContractExです。

IdentityDataReferenceまた、たまたま分散DLL(ソースコードがあります)に含まれているため、DataContractSerializerがリフレクションを使用して名前を自動的に解決しているのではないかと疑っています。おそらく、個別に分散されたDLLであるため、.NETがX8I0_S_SPU最後に追加されています、しかし、モノはそうではありません。

また、名前パラメーターを DataContractAttribute に次のように追加できることも発見しました。[DataContract(Name = "IdentityDataReference")]これにより、生成された名前が単に be にオーバーライドさIdentityDataReferenceれ、指定されたときに Of Type を追加しようとさえしません。

残念ながら、簡単なテストでは、名前を指定してデータを逆シリアル化しようとすると、Mono で実行時例外が発生することがわかりました。

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

編集 - 解決済みとしてマーク:

私は何年も前にこのプロジェクトから離れましたが、今日同じ問題に遭遇すると同じように感じるので、Katulus の回答に従ってこれを閉じることにしました。当時の私たちの希望は、既存の WCF サービスに追加の作業を行うことなく、"無料" で簡単なプラットフォーム間統合を実現できることでした。

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

4

2 に答える 2

4

異なるプラットフォーム間で通信している場合 (たとえ .NET と Mono が同じであろうとしても)、DataContractSerializer の使用を避ける必要があります。このバグ以外にも考えられる問題があります。たとえば、サーバー上のクラスを変更すると、すべてのクライアントが動作しなくなる可能性があり、その逆も同様です。両側を完全に制御できないサーバーとクライアントのシナリオでは、これは大きな問題になる可能性があります。

DataContractSerializer を、両側でより適切に制御できる XmlSerializer に変更します。または、将来のアップグレードに対応できるように、XML との間で独自のシリアライゼーションを実装することもできます。1 つのサーバーに新しいプロパティを追加すると、その新しいプロパティが古いクライアントにない場合に処理できる方法でデシリアライザーを更新できます。

于 2013-12-02T08:42:44.770 に答える
0

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

一般的には、datacontract の名前空間の使用を開始する必要があると思います。これは、参照バージョンの問題を特定するのに何度か役立ったため、コードがプロキシで実行されているバージョンを持っていることは非常に素晴らしいことです。しかし、それは別の用事です:)

おそらく、参照を作成するときに、インターフェイスを保持するパブリック ライブラリへの参照を追加できる場合は、サービス参照設定の「参照されたアセンブリから型を再利用する」を使用できます。

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

これが私の 5 セントのデバッグのヒントです、
乾杯

于 2013-10-31T10:24:10.250 に答える