xsi: проблема десериализации типов - PullRequest
1 голос
/ 04 марта 2011

У меня проблемы с десериализацией узла xml с атрибутом xsi: type.Часть кода:

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

после сериализации

http://imgur.com/uEJ1s

Значение может быть отлично сериализовано (на рисунке), но при его десериализации ValueObject не имеетвведите информацию, но System.Xml.XmlNode [3].

Это было на .net FX 4.0, C #

Есть идеи, почему?

Спасибо,

1 Ответ

2 голосов
/ 16 апреля 2011

Вы не отправили свой код, но я предполагаю, что вы не указали список возможных производных типов при создании 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>
...