當我嘗試反序列化我的FooContainer(List)時會拋出一個錯誤。請只看這段代碼的最後部分。爲什麼這個反序列化會拋出StackOverflow異常?
public interface IFoo
{
object Value { get; }
}
public abstract class Foo<T> : IFoo
{
[XmlElement("Value")]
public T Value { get; set; }
[XmlIgnore]
object IFoo.Value { get { return Value; } }
}
public class FooA : Foo<string> { }
public class FooB : Foo<int> { }
public class FooC : Foo<List<Double>> { }
[XmlRoot("Foos")]
public class FooContainer : List<IFoo>, IXmlSerializable
{
public XmlSchema GetSchema()
{
throw new NotImplementedException();
}
public void ReadXml(XmlReader reader)
{
XmlSerializer serial = new XmlSerializer(typeof(FooContainer));
serial.Deserialize(reader);
}
public void WriteXml(XmlWriter writer)
{
ForEach(x =>
{
XmlSerializer serial = new XmlSerializer(x.GetType(),
new Type[] { typeof(FooA), typeof(FooB), typeof(FooC) });
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\movie.xml");
serializer.Serialize(textWriter, fooList);
textWriter.Close();
XmlReader reader = XmlReader.Create(@"C:\temp\movie.xml");
var a = serializer.Deserialize(reader);
}
}
我在做什麼錯?
感謝您的回答,我得到了我現在應該做的。直到現在,我的疑問是如何存儲屬性值如果是T dataType? XmlSerialization編寫每種類型的數據類型,我真的不知道如何使用XmlWriter編寫此值。 –
@DarfZon:泛型和XML混合不太好。在你的具體而抽象的例子中,唯一可以確定'Foo'實際上是可序列化的方法是對你知道可序列化的'T'施加約束。現在它看起來不像'Foo ',即使做了很多事情;也許如果你更多地解釋你真正的問題是什麼(在一個新的問題中),有些人可能會幫助你理順。 –
Aaronaught