给定这段代码
public override void Serialize(BaseContentObject obj)
{
string file = ObjectDataStoreFolder + obj.Slug + ".xml";
if(obj.GetType() == typeof(Page))
{
DataContractSerializer dcs = new DataContractSerializer(typeof Page));
XmlDictionaryWriter myWriter =
XmlDictionaryWriter.CreateTextWriter(new FileStream(file, ileMode.CreateNew, FileAccess.Write),
Encoding.UTF8);
dcs.WriteObject(myWriter, obj);
myWriter.Close();
}
else if(obj.GetType() == typeof(Image))
{
DataContractSerializer dcs = new DataContractSerializer(typeof Image));
...
...
}
}
有没有办法做这样的事情
DataContractSerializer dcs = new DataContractSerializer(obj.GetType());
// this fails however, compiler error
并摆脱上面的那些 if() 语句? DataContractSerializer 的构造函数需要 Type 或 Namespace,但它不适用于 obj.GetType()。
我的类层次结构如下:
BaseContentClass(抽象)
页面(具体,继承BaseContentClass)
Image(具体,继承BaseContentClass)
...
?
最佳答案
告诉序列化程序预期什么:
[KnownType(typeof(Page))]
[KnownType(typeof(Image))]
[DataContract]
public abstract class BaseContentObject { /* ... */ }
[DataContract]
public class Page : BaseContentObject { /* ... */ }
[DataContract]
public class Image : BaseContentObject { /* ... */ }
然后您可以使用 new DataContractSerializer(typeof(BaseContentObject ))
处理所有内容。
关于c# - 具有抽象(基)/具体(继承)类的 DataContractSerializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2056596/