C# 字典真的需要使用ISerializable吗?

C# 字典真的需要使用ISerializable吗?,c#,.net,C#,.net,下面是字典的一些源代码 [可序列化] 公共类字典:IDictionary、IDictionary、IReadOnlyDictionary、ISerializable、IDeserializationCallback{ 受保护的字典(SerializationInfo、StreamingContext上下文){ ... } 公共虚拟void GetObjectData(SerializationInfo信息、StreamingContext上下文){ ... } 公共虚拟服务器(对象发送方){

下面是字典的一些源代码

[可序列化]
公共类字典:IDictionary、IDictionary、IReadOnlyDictionary、ISerializable、IDeserializationCallback{
受保护的字典(SerializationInfo、StreamingContext上下文){
...
}
公共虚拟void GetObjectData(SerializationInfo信息、StreamingContext上下文){
...
}
公共虚拟服务器(对象发送方){
...
}
...
}
我对ISerializable的工作原理有一个大致的了解,例如格式化程序如何构造一个
SerializationInfo
并将其传递给字典,当foramtter进行反序列化时,它检索
SerializationInfo
并调用字典的特定受保护构造函数并传递此对象等


但我不知道为什么微软需要让Dictionary对序列化/反序列化使用这种特殊的控制。这太复杂了,是的,foramter确实不需要直接序列化/反序列化字典,但是格式化程序仍然需要序列化/反序列化
SerializationInfo
,其中包含字典的“数据”,因此仍然涉及反射,我可以看出这种方法的任何优点,为什么不直接使用
[Serializable]
attributer对字典进行序列化/反序列化?

请记住,在程序的AppDomains/调用之间,对象的哈希代码可能不同。因此,不能通过序列化任何涉及实际哈希代码的内容来序列化哈希表。您可以看到通过重新计算所有元素的哈希代码来备份存储桶。您有一个StreamingContext需要分析。@canton7谢谢您的回答。你能再解释一下为什么“在我的程序的AppDomains/调用之间,对象的哈希代码可能不一样”?您的意思是,字典中的TKey可能没有覆盖
GetHashCode
方法,这可能会导致AppDomains/程序调用之间出现问题。我的意思是,
someObject。GetHashCode()
在不同的AppDomains中调用时,对于被认为相等的对象,可能不会返回相同的哈希代码<例如,code>string添加了一个随机因子,以便
“test”。GetHashCode()
可以在不同的AppDomain中返回不同的值,作为一项安全功能。@canton7您可以看看这个问题吗?
[Serializable]
public class Dictionary<TKey,TValue>: IDictionary<TKey,TValue>, IDictionary, IReadOnlyDictionary<TKey, TValue>, ISerializable, IDeserializationCallback  {
   protected Dictionary(SerializationInfo info, StreamingContext context) {
      ...
   }

   public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
      ...
   }
   public virtual void OnDeserialization(Object sender) {
      ...
   }
   ...
}