迁移到 DataContractSerializer (XML)
.NET 基类库提供两个 XML 序列化程序:XmlSerializer 和 DataContractSerializer。 这两者之间存在一些细微的差异,但出于迁移的目的,本部分只重点介绍 DataContractSerializer
。 为什么? 因为它完全支持 BinaryFormatter
所使用的 serialization 编程模型。 已标记为 [Serializable]
或实现 ISerializable
的所有类型都可以使用 DataContractSerializer
进行序列化。 需要注意什么? 必须提前指定已知类型。 需要了解这些类型,并能够获取 Type
,即使是用于专用类型。
不需要指定最常用的集合或基元类型,如 string
或 DateTime
(序列化程序有自己的默认允许列表),但也有例外,如 DateTimeOffset
。 有关支持的类型的详细信息,请参阅数据协定序列化程序支持的类型。
部分信任是一项未移植到 .NET (Core) 的 .NET Framework 功能。 如果代码在 .NET Framework 上运行并使用此功能,请阅读限制,了解此类方案可能适用的限制。
分步迁移
- 查找
BinaryFormatter
的所有用法。 - 确保 serialization 代码路径被测试覆盖,以便你可以验证你的更改并避免引入 bug。
- 无需安装任何包,因为
DataContractSerializer
是 .NET Core 库的一部分。 - 查找要使用
BinaryFormatter
序列化的所有类型。 无需修改它们中的任何一个,但可能需要通过DataContractSerializer
构造函数的knownTypes
参数列出它们。 - 将
BinaryFormatter
的用法替换为DataContractSerializer
。
DataContractSerializer serializer = new(
type: input.GetType(),
knownTypes: new Type[]
{
typeof(MyType1),
typeof(MyType2)
});