在SerializationInfo中获取具有值的成员

3
有没有办法在实现ISerializable接口对象的GetDataObject方法中知道哪些成员被添加到了SerializationInfo的实例中?
2个回答

8

有趣!你有任何想法为什么它没有实现 IEnumerable 吗?而且为什么它返回一个具体的 SerializationInfoEnumerator 而不是一个 IEnumerator?这似乎是一个奇怪的选择... - dcastro
如果我要猜的话,缺少IEnumerable可能是一个疏忽,因为它并不是必需的。选择自定义迭代器并不是很常见,特别是在泛型之前的代码中,目的是通过使用结构体来表示状态来避免装箱和分配。即使在泛型代码中也很常见:例如,List-of-T具有自定义迭代器。 - Marc Gravell
是的,List<T> 还返回了自己的自定义迭代器,以实现“如果列表已更改,则抛出异常”的机制。但它仍以接口的形式返回迭代器。但我同意这可能是为了避免装箱 - 我只是注意到 SerializationInfoEnumerator 有两个 Current 属性,一个明确实现返回一个 object,另一个返回一个 SerializationEntry - dcastro
@dcastrono 不需要公开可见的自定义迭代器类型就可以执行“throw”操作,也不会将其隐藏在接口后面 - 明确地自定义:List<T>.Enumerator(请参见http://msdn.microsoft.com/en-us/library/b0yss765(v=vs.110).aspx)。这样做的唯一原因是避免分配,这是值得的,因为`List<T>非常常见。遗憾的是LINQ没有使用它。很想编写一个List<T>`-LINQ库 :) - Marc Gravell
我完全错过了这一点……这可能有点偏题,但是:由于List<T>不是泛型之前的东西……返回一个非自定义的泛型IEnumerator<T>也不会产生分配,对吗? - dcastro
显示剩余8条评论

2
似乎没有“包含”方法。您可以使用GetEnumerator方法来循环遍历它。但是,Marc的foreach建议更好 :)

对于大多数有用的定义,GetEnumerator() 就是 foreach - 它们本质上是同义词。 - Marc Gravell
完整的上下文是,foreach(var item in obj) { /* your code */ } 基本上 等同于 using(var iter = obj.GetEnumerator()) { while (iter.MoveNext()) { var item = iter.Current; /* your code */ }} - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接