迁移到 DataContractSerializer (XML)

.NET 基类库提供两个 XML 序列化程序:XmlSerializerDataContractSerializer。 这两者之间存在一些细微的差异,但出于迁移的目的,本部分只重点介绍 DataContractSerializer。 为什么? 因为它完全支持 BinaryFormatter 所使用的 serialization 编程模型。 已标记为 [Serializable] 或实现 ISerializable 的所有类型都可以使用 DataContractSerializer 进行序列化。 需要注意什么? 必须提前指定已知类型。 需要了解这些类型,并能够获取 Type,即使是用于专用类型

不需要指定最常用的集合或基元类型,如 stringDateTime(序列化程序有自己的默认允许列表),但也有例外,如 DateTimeOffset。 有关支持的类型的详细信息,请参阅数据协定序列化程序支持的类型

部分信任是一项未移植到 .NET (Core) 的 .NET Framework 功能。 如果代码在 .NET Framework 上运行并使用此功能,请阅读限制,了解此类方案可能适用的限制。

分步迁移

  1. 查找 BinaryFormatter 的所有用法。
  2. 确保 serialization 代码路径被测试覆盖,以便你可以验证你的更改并避免引入 bug。
  3. 无需安装任何包,因为 DataContractSerializer 是 .NET Core 库的一部分。
  4. 查找要使用 BinaryFormatter 序列化的所有类型。 无需修改它们中的任何一个,但可能需要通过 DataContractSerializer 构造函数的 knownTypes 参数列出它们。
  5. BinaryFormatter 的用法替换为 DataContractSerializer
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });