如何使用 IXmlSerializer 序列化和反序列化接口
本文关键字:反序列化 接口 序列化 何使用 IXmlSerializer | 更新日期: 2023-09-27 18:33:18
我正在尝试序列化一个接口。我知道这在标准序列化中是不可能的,这就是我在基类中使用自定义序列化的原因。
public interface IFoo
{
object Value { get; }
}
public abstract class Foo<T> : IFoo, IXmlSerializable
{
[XmlElement]
public T Value { get; set; }
[XmlIgnore]
object IFoo.Value { get { return Value; } }
XmlSchema IXmlSerializable.GetSchema() { return null; }
void IXmlSerializable.ReadXml(XmlReader reader) { throw new NotImplementedException(); }
void IXmlSerializable.WriteXml(XmlWriter writer)
{
XmlSerializer serial = new XmlSerializer(Value.GetType());
serial.Serialize(writer, Value);
}
}
public class FooA : Foo<string> { }
public class FooB : Foo<int> { }
public class FooC : Foo<List<Double>> { }
public class FooContainer : List<IFoo>, IXmlSerializable
{
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader) { throw new NotImplementedException(); }
public void WriteXml(XmlWriter writer)
{
ForEach(x =>
{
XmlSerializer serial = new XmlSerializer(x.GetType());
serial.Serialize(writer, x);
});
}
}
class Program
{
static void Main(string[] args)
{
FooContainer fooList = new FooContainer()
{
new FooA() { Value = "String" },
new FooB() { Value = 2 },
new FooC() { Value = new List<double>() {2, 3.4 } }
};
XmlSerializer serializer = new XmlSerializer(fooList.GetType(),
new Type[] { typeof(FooA), typeof(FooB), typeof(FooC) });
System.IO.TextWriter textWriter = new System.IO.StreamWriter(@"C:'temp'demo.xml");
serializer.Serialize(textWriter, fooList);
textWriter.Close();
}
}
我的自定义序列化不正确。目前正在保存所有属性值,但是要反序列化,我真的不知道该怎么做。
这个想法是保存属性 Value 并恢复带有元素的 fooContainer。
反序列化程序不仅会反序列化属性值,还会反序列化包含它们的对象。该对象不能是 IMyInterface
类型,因为它是一个接口,不能实例化。您需要序列化该接口的实现,并将其反序列化,或者分配要反序列化到的接口的默认实现。