2009-10-30 20 views
11

欠けているDataContractSerializerが適切にデシリアライズしない、オブジェクトのメソッドの値は私の工ass

[Serializable] 
[DataContract(Namespace = "")] 
public class SomeClass 
{ 
    [DataMember] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember] 
    private IDictionary<long, string> customValues; 
    public IDictionary<long, string> CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 

私のXMLファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<SomeClass> 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
<CustomValues> 
    <Value1>One</Value1> 
    <Value2>Two</Value2> 
</CustomValues > 
</SomeClass> 

しかし、私の問題は、クラスのためですが、私は唯一のいくつかを取得していますデシリアライズするときの私のメソッドのデータ。

var xmlRoot = XElement.Load(new StreamReader(
        filterContext.HttpContext.Request.InputStream, 
        filterContext.HttpContext.Request.ContentEncoding)); 
XmlDictionaryReader reader = XmlDictionaryReader.CreateDictionaryReader(xmlRoot.CreateReader()); 
DataContractSerializer ser = new DataContractSerializer(typeof(SomeClass)); 
//Deserialize the data and read it from the instance. 
SomeClass someClass = (SomeClass)ser.ReadObject(reader, true); 

したがって、「someClass」にチェックを入れると、FirstNameの値はjohnになりますが、LastNameはnullになります。

ミステリーはどのようにデータの一部を取得でき、そのクラスのすべてのデータを取得することはできません。 デシリアライズ時にDataContractSerializerがXMLからすべてのデータをプルアップしていません。

私は何か間違っていますか?

何か助けていただければ幸いです。前もって感謝します。まあ、私はそれがalpahbetical順序でなければならない....たくさんの周りにそれを再生した後、自分の解答を見つけた

は、誰もが同じ問題を持っているなら、私を知ってみましょうか、いずれかの解決策

+1

だろうあなたの最初の例では

は、データメンバーattrが公共の財産ではなく民間の1にすべきではありませんか? – Dani

答えて

16

を持っています。 クラスがある場合

[Serializable] 
[DataContract(Namespace = "")]  
public class SomeClass 
{ 
    [DataMember] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember] 
    private IDictionary<long, string> customValues; 
    public IDictionary<long, string> CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 

xmlはアルファベット順に定義する必要があります。

<?xml version="1.0" encoding="UTF-8"?> 
<SomeClass> 
<CustomValues> 
    <Value1>One</Value1> 
    <Value2>Two</Value2> 
</CustomValues > 
<FirstName>John</FirstName> 
<LastName>Smith</LastName> 
</SomeClass> 

なぜそれがアルファベット順である必要がありますか?

+1

「パフォーマンス」は明らかです。狂気! –

+0

この素晴らしい知識を投稿していただきありがとうございます。私は「ほぼ」何時間も働く同じコードを頭に浮かべています。クイックスキーマの変更とそれは扱います。なぜこれが製品でより明確に文書化されていないのか疑問に思っています。 +1 –

+1

うわー、私はまた、これに対する解決策を見つけようと時間を無駄にしました。これは、WebサービスがWSDL仕様とは異なる順序でXML要素を返す場合、いくつかの深刻な問題を引き起こします。この場合、SvcUtilによって生成されたプロキシは誤った順序付けを持ち、デシリアライゼーションは自動的に失敗します。 – Oenotria

13

これは、Order属性のためのものです。デシリアライズするXMLを制御できない場合は、それが私が知っている唯一の回避策です。

[Serializable] 
[DataContract(Namespace = "")] 
public class SomeClass 
{ 
    [DataMember(Order = 0)] 
    public string FirstName 
    { 
     get; set; 
    } 

    [DataMember(Order = 1)] 
    public string LastName 
    { 
     get; set; 
    } 

    [DataMember(Order = 2)] 
    private IDictionary customValues; 
    public IDictionary CustomValues 
    { 
     get { return customValues; } 
     set { customValues = value; } 
    } 
} 
関連する問題