0

この QA は、他のユーザーを支援するために、また Xamarin.Android Bugzilla エリアのバグ レポート 11881のパートナーとして、ここに投稿していることに注意してください。そのため、以下で説明するタイプはデモンストレーションのみを目的としています。同じバグレポートを参照して、最初の回答を投稿しましたが、ある時点で、この質問は「これはバージョン xy で修正されました」で「回答」できることを願っています。

Mono for Android と Windows RT ソースの間で次のタイプを共有しています。

[CollectionDataContract(Name = "MyDictionary", 
    Namespace = "http://foo.bar/schema", 
    ItemName = "pair", 
    KeyName = "mykey", 
    ValueName = "myvalue")]
public class MyDictionary : Dictionary<string, string>
{

}

これは、Web API (Asp.Net Web API、Framework 4.5 で実行) から次のような XML として読み取られます。

<MyDictionary 
 xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://foo.bar/schema">
  <pair>
    <mykey>message1</mykey>
    <myvalue>Hello</myvalue>
  <pair>
  <pair>
    <mykey>message2</mykey>
    <myvalue>World</myvalue>
  <pair>
</MyDictionary>

上記のクラスを使用すると、この XML は Windows、Windows Phone、および Win-RT プラットフォームで正しく逆シリアル化されます。

ただし、Mono for Android ビルドでは

System.Runtime.Serialization.SerializationException: Expected element 'ArrayOfpair' in namespace 'http://foo.bar/schema', but found Element node 'MyDictionary' in namespace 'http://foo.bar/schema'.

私は何を間違えましたか?

4

1 に答える 1

0

MyDictionary私が何も悪いことをしていないと仮定して - のインスタンスがMono for Android 実装によって正しくシリアル化されるかどうかをテストする NUnitLight 単体テストを作成しましたDataContractSerializer

public string Serialize(object o)
{
  DataContractSerializer ser = new DataContractSerializer(o.GetType());
  using (var ms = new MemoryStream())
  {
    ser.WriteObject(ms, o);
    return Encoding.Default.GetString(ms.ToArray());
  }
}

[Test]
public void ShouldSerializeDictionaryCorrectlyAndDeserialize()
{
  MyDictionary dict = new MyDictionary();
  dict["message1"] = "hello";
  dict["message2"] = "world";
  var s = Serialize(dict);
  Assert.That(s, Is.StringStarting("<MyDictionary"));
}

単体テストは失敗し、出力文字列は 'MyDictionary' ではなく'ArrayOfpair' で始まります。これは、'ArrayOfpair' が開始しないために正しいXMLの逆シリアル化が失敗する元の動作と一致します。

したがって、これは Mono for Android 実装のバグの良い候補ですDataContractSerializer(私はここでバグを報告しました) - しかし、そのバグが確認され、修正されるまで、回避策が必要になります。私の場合、対処するコードベースの問題 (Android、Windows、Monotouch) を共有しているため、このタイプを Android 用に書き直すだけではありません。まともな回避策を思いついたら、この回答に投稿します。

注意してください-これがMonotouchにも当てはまるかどうかはまだわかりません-同じテストを実行するのに十分なコンポーネントの完全なビルドがまだないため、そうなるかもしれませんが、わかりません.

于 2013-04-22T10:56:25.353 に答える