c# - 具有抽象(基)/具体(继承)类的 DataContractSerializer

标签 c# .net serialization

给定这段代码

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/

相关文章:

javascript - 输入类型文件不序列化 jquery

c++ - 如何使用 boost XML 存档序列化 OpenCV Mat

java - 如何使用 Rhino shell 将 JavaScript 代码序列化到文件?

c# - SQL 连接最佳实践

c# - 巢-IndexMany不索引我的对象

C#-我想在我的 wpf 应用程序中添加帮助文件?

c# - 我可以将 WCF DataContract 添加到复杂类型吗?

.net - 无法确保我安装了最新版本的 .NET Core

c# - 如何在 Windsor Installer 中使用 IConfigurationStore 参数?

c# - 如何在 ASP.NET Core 3.1 MVC 中进行自定义路由