XmlReader.ReadContentAsObject всегда возвращает строковый тип - PullRequest
0 голосов
/ 30 августа 2011

Согласно документации MSDN, XMLWriter.WriteValue записывает информацию о типе xsd в xml для простых типов CLR.Затем XMLReader.ReadContentAsObject предположительно считывает объект с соответствующей типизацией при анализе XML.Тем не менее, мне кажется, что это всегда возвращает строковый объект, а свойство ValueType XMLReader является строковым.Я пытался вставить long и DateTimes, но они всегда заканчиваются как строки.Есть идеи, что я делаю не так, или это ошибка Windows Phone?

Код записи XML

public void WriteXml(XmlWriter writer) {
    // KeyValuePair<string, object> pair initialized previously
    writer.WriteStartElement(pair.Key);
    writer.WriteValue(pair.Value)
    writer.WriteEndElement();
 }

Код синтаксического анализа XML

public void ReadXml(XMLReader reader) {
    while (reader.Read()) {
        if (reader.NodeType == XmlNodeType.Element) {
            Type T = reader.ValueType; // T is string
            reader.ReadStartElement();
            object o = reader.ReadContentAsObject(); // o is string
            o = reader.ReadContentAs(T, null); // o is string
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 31 августа 2011

MSDN говорит: :

Если при синтаксическом анализе содержимого возникает ошибка проверки, и средство чтения является объектом XmlReader, созданным методом Create, средство чтения возвращает содержимое какстрока.Другими словами, при возникновении ошибки или предупреждения проверки содержимое считается нетипизированным.

0 голосов
/ 12 сентября 2011

Я делал это слишком сложно. Моя цель состояла в том, чтобы сериализовать словарь с универсальным типом (строка, объект) путем обхода его KeyValuePairs, но этот класс, по-видимому, не сериализуем с использованием XmlSerializer. Я только что создал другой класс с двумя открытыми свойствами, Key и Value, чтобы я мог использовать XmlSerializer. При десериализации с помощью XmlSerializer тип Value восстанавливается при условии, что это поддерживаемый тип CLR.

public void WriteXml(XmlWriter writer) {
    // KeyValuePair<string, object> pair initialized previously
    writer.WriteStartElement("entry");        
    MyClass toSerialize = new MyClass(pair.Key, pair.Value);
    XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
    serializer.Serialize(writer, toSerialize);
    writer.WriteEndElement();

}

0 голосов
/ 31 августа 2011

Вам необходимо использовать файл схемы (XSD), чтобы инфраструктура могла определить тип узла. В противном случае ValueType всегда будет возвращать System.String.

...