XmlReader.ReadContentAsObject始终返回字符串类型

时间:2011-08-30 18:34:52

标签: windows-phone-7 xml-serialization

根据MSDN文档,XMLWriter.WriteValue将xsd类型信息写入xml,以用于简单的CLR类型。然后,XMLReaderConadAsObject会在解析XML时读出适当类型的对象。但是,这似乎总是为我返回一个字符串对象,而XMLReader的ValueType属性是字符串。我已经尝试插入longs和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 :(得分:0)

您需要使用模式文件(XSD),以便框架可以推断节点的类型。否则ValueType将始终返回System.String。

答案 1 :(得分:0)

MSDN says

  

如果在解析内容时发生验证错误,并且reader是由Create方法创建的XmlReader对象,则阅读器将内容作为字符串返回。换句话说,当发生验证错误或警告时,内容被视为无类型。

答案 2 :(得分:0)

我让这太难了。我的目标是通过遍历其KeyValuePairs来序列化具有泛型类型(字符串,对象)的字典,但该类似乎不能使用XmlSerializer进行序列化。我刚刚创建了另一个具有两个公共属性Key和Value的类,所以我可以使用XmlSerializer。使用XmlSerializer进行反序列化时,只要它是受支持的CLR类型,就会恢复Value的类型。

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();

}