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

假设我没有做错任何事 - 我编写了一个 NUnitLight 单元测试来测试MyDictionaryMono for Android 实现的实例是否会被正确序列化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"));
}

单元测试失败,输出字符串以“ArrayOfpair”开头而不是“MyDictionary”,这与正确XML的反序列化失败的原始行为一致,因为它没有以“ArrayOfpair”开头。

因此,这是 Mono for Android 实现中的错误的一个很好的候选者DataContractSerializer我已经在此处报告了错误) - 但在确认并修复该错误之前,将需要解决方法。就我而言,我已经共享了要解决的代码库问题(Android、Windows 和 Monotouch),因此我不想只为 Android 重写这种类型。如果我想出一个体面的解决方法,我会在这个答案上发布。

请注意 - 我还不知道这是否也适用于 Monotouch - 我们还没有足够完整的组件构建来运行相同的测试,所以它可能会,我只是不知道。

于 2013-04-22T10:56:25.353 回答