12

私のいくつかのクラス

[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 からすべてのデータを取得しているわけではありません。

私は何か間違ったことをしていますか?

どんな助けでも大歓迎です。前もって感謝します。

同じ問題を抱えている人、または解決策を知っている人がいたら教えてください

4

2 に答える 2

17

まあ、私はそれをたくさん遊んだ後、私自身の答えを見つけました....それはアルファベット順でなければなりません。クラスが持っている場合

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

なぜ h... アルファベット順でなければならないのですか?

于 2009-10-30T19:32:50.040 に答える
15

それが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; }
    }
}
于 2010-04-03T15:36:45.193 に答える