2013-04-22 78 views
0

請注意我在此處發佈此質量保證以幫助其他人以及bug report 11881 on the Xamarin.Android Bugzilla area的合作伙伴。因此,下面描述的類型僅用於演示目的。我已經發布了一個初步的答案,也參考了同一個錯誤報告,但希望在某個時候,這個問題可以'回答','已經在x.y版本中修復'。(MfA) - 字典類型上的CollectionDataContractAttribute的名稱屬性被忽略

我有單間共享針對Android和Windows RT來源如下類型:如XML,看起來

[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運行,框架4.5)像這樣:

<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手機和Win-RT平臺。

然而,在Mono的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'

我做錯了什麼?

回答

0

假設我沒有做錯任何事 - 我寫了一個NUnitLight單元測試,以測試是否MyDictionary的實例會被正確地由單爲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'而失敗。

這一點,因此,適用於Android實現DataContractSerializerI have reported the bug here)在單一個bug一個很好的候選人 - 但直到這個bug被確認以及固定的,就需要一種解決方法。在我的例子中,我共享了代碼庫問題(Android,Windows和Monotouch)以應對,所以我不想只爲Android重寫這種類型。如果我想出一個體面的解決方法,我會在這個答案上發佈它。

請注意 - 我還不知道這是否也適用於Monotouch - 我們還沒有足夠的構建我們的組件來運行相同的測試,所以它可能會做,我只是不知道。

相關問題