DataContractSerializer не выполняет десериализацию должным образом, отсутствуют значения для методов в объекте

My SomeClass

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

Но моя проблема для класса, я получаю только некоторые данные для своих методов, когда я deserialize.

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.

Mystery - как я могу получить некоторые данные, а не все данные для класса. Поэтому DataContractSerializer не вытягивает все данные из xml при десериализации.

Я делаю что-то не так.

Любая помощь приветствуется. Спасибо заранее.

Сообщите мне, есть ли у кого-то такая же проблема или у кого-нибудь есть решение

Ответ 1

Ну, я нашел свой собственный ответ, много раз поиграв... это должно быть в альпахетическом порядке. поэтому если класс имеет

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

ну почему х... он должен быть в алфавитном порядке?

Ответ 2

Это для атрибута 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; }
    }
}