Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# protobuf net在序列化/反序列化可枚举实例时使用了什么迭代方法?_C#_Protobuf Net - Fatal编程技术网

C# protobuf net在序列化/反序列化可枚举实例时使用了什么迭代方法?

C# protobuf net在序列化/反序列化可枚举实例时使用了什么迭代方法?,c#,protobuf-net,C#,Protobuf Net,可枚举实例可以来自List、Dictionary、ConcurrentDictionary或my own类。如果您有一个带有普通IEnumerable属性的类,如下所示: [协议] 类虚拟 { [原成员(1)] 公共IEnumerable值{get;set;} } 然后,当protobuf net反序列化对象时,实际的底层对象将是一个列表——在本例中是一个列表 对于序列化,如果您将其设置为完全自定义的可枚举实现,protobuf net将按照普通方式对其进行迭代,并序列化每个值。如果您有一个具

可枚举实例可以来自List、Dictionary、ConcurrentDictionary或my own类。

如果您有一个带有普通
IEnumerable
属性的类,如下所示:

[协议]
类虚拟
{
[原成员(1)]
公共IEnumerable值{get;set;}
}
然后,当protobuf net反序列化对象时,实际的底层对象将是一个
列表
——在本例中是一个
列表


对于序列化,如果您将其设置为完全自定义的可枚举实现,protobuf net将按照普通方式对其进行迭代,并序列化每个值。

如果您有一个具有纯
IEnumerable
属性的类,如下所示:

[协议]
类虚拟
{
[原成员(1)]
公共IEnumerable值{get;set;}
}
然后,当protobuf net反序列化对象时,实际的底层对象将是一个
列表
——在本例中是一个
列表


对于序列化,如果您将其设置为完全自定义的可枚举实现,protobuf net只需按照常规对其进行迭代并序列化每个值。

这是一个令人惊讶的复杂问题。序列化时,它通常只使用
foreach
,即
GetEnumerator()
API或基于平面索引器的数组枚举。反序列化时,它主要尝试查找
.Add(YourType t)
方法。对于字典,它将查找
Add(KeyValuePair)
Add(TKey,TValue)
,或者索引器
TValue this[TKey]
(特别是“地图”)

然而!现实比这更微妙,因为我们还需要考虑一系列更复杂的集合类型。对于2.4.*这很难理解,因为它都是运行时IL,但是:对于3.0分支,您可以看到一些场景-特别是,请参见:

  • RepeatedSerializer.cs
  • RepeatedSerializer.Immutable.cs
  • RepeatedSerializer.Concurrent.cs
  • MapSerializer.cs
  • MapSerializer.Immutable.cs
  • MapSerializer.Concurrent.cs

然而,通常情况下:答案是:“它只会起作用。”

这是一个令人惊讶的复杂问题。序列化时,它通常只使用
foreach
,即
GetEnumerator()
API或基于平面索引器的数组枚举。反序列化时,它主要尝试查找
.Add(YourType t)
方法。对于字典,它将查找
Add(KeyValuePair)
Add(TKey,TValue)
,或者索引器
TValue this[TKey]
(特别是“地图”)

然而!现实比这更微妙,因为我们还需要考虑一系列更复杂的集合类型。对于2.4.*这很难理解,因为它都是运行时IL,但是:对于3.0分支,您可以看到一些场景-特别是,请参见:

  • RepeatedSerializer.cs
  • RepeatedSerializer.Immutable.cs
  • RepeatedSerializer.Concurrent.cs
  • MapSerializer.cs
  • MapSerializer.Immutable.cs
  • MapSerializer.Concurrent.cs

然而,通常情况下:答案是:“它只会工作”。

序列化时可能会发生集合修改,并抛出异常。可以毫无例外地使用哪种集合类型?2.4.*版本是否支持不可变*类型?@JeffreyHill“序列化时可能会发生集合修改,并引发异常。”-您是否有具体示例,以便我们可以在上下文中讨论?在序列化时发生这种情况是非常罕见的。“哪种集合类型可以毫无例外地使用?”-需要有关您看到的异常的更多信息。“2.4.*版本是否支持不可变的*类型?”-原则上是的,但在3.*版本中支持更好;如果发现问题,请告诉我!异常抛出,因为序列化对象不是线程安全的。@JeffreyHill大多数对象不是;如果你正在序列化一个非线程安全的对象,你真的不应该从其他线程中插入它,但这对于任何以这种方式工作的代码都是正确的,并且不是特定于序列化的;这感觉像是X/Y问题,序列化时可能会发生集合修改,并引发异常。可以毫无例外地使用哪种集合类型?2.4.*版本是否支持不可变*类型?@JeffreyHill“序列化时可能会发生集合修改,并引发异常。”-您是否有具体示例,以便我们可以在上下文中讨论?在序列化时发生这种情况是非常罕见的。“哪种集合类型可以毫无例外地使用?”-需要有关您看到的异常的更多信息。“2.4.*版本是否支持不可变的*类型?”-原则上是的,但在3.*版本中支持更好;如果发现问题,请告诉我!异常抛出,因为序列化对象不是线程安全的。@JeffreyHill大多数对象不是;如果你正在序列化一个非线程安全的对象,你真的不应该从其他线程中插入它,但这对于任何以这种方式工作的代码都是正确的,并且不是特定于序列化的;这感觉像是一个X/Y问题