During serialization, I pass a reference to the XmlSerializer. The reference never points to the base class; it points to one of the derived classes.
So when I attempt to serialize
public class Base
public class Derived1 : Base
public class Derived2 : Base
public class DerivedN : Base
XmlSerializer ser = new XmlSerializer(typeof(Base));
StreamWriter writer = new StreamWriter(sFilename);
ser.Serialize(writer, DerivedClassFactory.CreateRandom() );
//DerivedClassFactory can create any of the derived classes..
On this last line, the execution fails with a run time error:
"The type LibraryName.Classname was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."
I took this suggestion and added
[System.Xml.Serialization.XmlInclude(typeof(Derived1))]
[System.Xml.Serialization.XmlInclude(typeof(Derived2))]
[System.Xml.Serialization.XmlInclude(typeof(DerivedN))]
to the Base class definition. The code now executes fine. The problem is, what if I do not own the base class definition? What if I do not have access to the base class definition? Isn't there a better way to do this????
You can achieve the same by using different XmlSerializer ctor, the one that takes an univerce of “known” types: public XmlSerializer(Type type, Type[] extraTypes){..}
In your case: new XmlSerializer(typeof(Base), new Type[] { typeof(Derived1), ..});
Комментариев нет:
Отправить комментарий