xsi:类型反序列化问题

时间:2011-03-04 15:24:46

标签: xml xml-deserialization xsitype

我在反序列化具有xsi:type属性的xml节点时遇到问题。部分代码:

    [XmlElement("ValueObject")]
    public object ValueObject       {
        get 
        {...
        }
        set 
        {...
        }
    }
序列化后

http://imgur.com/uEJ1s

值可以序列化很好(如图),但是当它被反序列化时,ValueObject没有类型信息,但System.Xml.XmlNode [3]。

这是在.net fx 4.0,C#

任何想法为什么?

谢谢,

1 个答案:

答案 0 :(得分:2)

您尚未发送代码,但在创建XmlSerializer时,我猜您没有指出可能的派生类型列表。下面是一个使用DateTime和float作为Value的派生类型的示例:

using System;
using System.IO;
using System.Xml.Serialization;

public class Test
{
        public class ValueObject
        {
            [XmlElement("Value")] // This XML array does not have a container
            public object[] Values;
            public ValueObject() {}
        }

        static void Main(string[] args)
        {
            ValueObject value1 = new ValueObject();
            value1.Values = new object[] { DateTime.Now, 3.14159f };
            save("test.xml", value1);
            ValueObject value2 = load("test.xml");
        }

        static void save(string filename, ValueObject item)
        {
            XmlSerializer x = new XmlSerializer(typeof(ValueObject), new Type[] { typeof(DateTime), typeof(float) });
            FileStream fs = new FileStream(filename, FileMode.Create);
            x.Serialize(fs, item);
            fs.Close();
        }

        static ValueObject load(string filename)
        {
            XmlSerializer x = new XmlSerializer(typeof(ValueObject), new Type[] { typeof(DateTime), typeof(float) });
            FileStream fs = new FileStream(filename, FileMode.Open);
            ValueObject valueObject = (ValueObject)x.Deserialize(fs);
            fs.Close();
            return valueObject;
        }
}

此代码生成和使用的XML是:

<?xml version="1.0"?>
<ValueObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Value xsi:type="xsd:dateTime">2011-04-16T00:15:11.5933632+02:00</Value>
  <Value xsi:type="xsd:float">3.14159</Value>
</ValueObject>