gpt4 book ai didi

c# - 在给定类更改的情况下,在序列化之间键入对象

转载 作者:行者123 更新时间:2023-11-30 17:26:44 24 4
gpt4 key购买 nike

我将类型相关信息存储在字典中,例如

Dictionary<Type, int> TypeInformation;

TypeInformation[typeof(OneOfMyOwnClasses)] = 42;

然后我(二进制)序列化我的应用程序的状态,包括上面的字典。

如果我在代码中更改OneOfMyOwnClasses,类型对象会发生什么情况?在反序列化后类型对象在什么情况下保持不变? IE。什么时候

if (TypeInformation[typeof(OneOfMyOwnClasses)] == 42)
MessageBox.Show("Yahoo !!!");

即使在我反序列化我的应用程序状态后仍给出肯定的结果?

  • 方法体的改变是否保证在不同运行之间提供相同类型的对象?
  • 私有(private)方法或字段名称的更改是否会改变类型对象的任何内容?
  • 更改公共(public)方法(或字段)名称?
  • 更改命名空间或程序集?
  • 类名本身的变化? (应该不是……;-))

最后,考虑到所有这些,是否有任何充分的理由不序列化类型信息,是否有更好但更复杂的方法(如创建 GUID 等)?

最佳答案

假设您的意思是 BinaryFormatter,那么:

  1. 如果要存储类型的实例或 Type 对象本身,更改类型、命名空间或类型的程序集标识将破坏序列化程序
  2. 更改类型上字段的名称或类型将破坏序列化程序,如果您正在存储该类型的实例<

在这两种情况下,都有一些方法可以通过跳过复杂的环节来修复它,但尝试通常不是一个好主意。根据我考虑的经验,BinaryFormatter 根本不是一个好的选择,除非在非常特殊的情况下(特别是,两个正在运行的应用程序之间的 RPC 必须运行完全相同的代码 - 例如 app-domain隔离),如果您的目的是通用存储,您通常最好使用任何其他。我特别倾向于 protobuf-net(它是“二进制的”,因为它实现了谷歌的二进制“ Protocol Buffer ”格式),但我承认我有偏见。就可移植性而言,JSON 和 XML 也是不错的选择,尽管它们几乎总是具有更大的输出和(稍微)更慢的处理速度。

请注意,大多数 序列化程序在序列化 Type 对象时将使用完全限定名称,因此上面的第 1 点将适用于大多数,尽管每个序列化程序的方式可能存在的变化。不过,坦率地说,如果您正在序列化一个 Type 实例,那么您做错了什么,最好将其作为手册来执行针对某些外部引用进行键控查找(例如,可以通过类型的属性)。例如:

[SomeMarker("abc")]
class OneOfMyOwnClasses {...}

然后使用反射获取 SomeMarkerAttribute 实例(以某种缓存方式),以便您实际存储:

Type type = ...
string key = GetMarkerFromType(type); // "abc"
Dictionary<string, int> TypeInformation;
TypeInformation[key] = 42;

关于c# - 在给定类更改的情况下,在序列化之间键入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com