1

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

    [XmlElement("ValueObject")]
    public object ValueObject       {
        get 
        {...
        }
        set 
        {...
        }
    }

序列化后

http://imgur.com/uEJ1s

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

这是.net fx 4.0,C#

任何想法为什么?

谢谢,

4

1 回答 1

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>
于 2011-04-15T22:21:18.560 回答