gpt4 book ai didi

c# - 为什么不能在类级别使用 'NonSerialized' 属性?如何防止类的序列化?

转载 作者:行者123 更新时间:2023-11-30 14:43:00 25 4
gpt4 key购买 nike

我有一个使用二进制序列化深度克隆的数据对象。此数据对象支持属性更改事件,例如 PriceChanged。

假设我将处理程序附加到 PriceChanged。当代码尝试序列化 PriceChanged 时,它会抛出一个异常,表明处理程序未标记为可序列化。

我的选择:

  • 我无法在序列化之前轻易地从事件中删除所有处理程序
  • 我不想将处理程序标记为可序列化,因为我还必须递归地标记所有处理程序依赖项。
  • 我不想将 PriceChanged 标记为 NonSerialized - 有数十个这样的事件可能有处理程序。编辑:我不能这样做的另一个原因是因为生成了数据类(以及事件),而我无法直接控制生成代码。理想情况下,生成代码会将所有事件标记为非序列化。
  • 理想情况下,我希望 .NET 在那个时候停止沿着对象图向下移动,并使它成为“叶子”。 那么为什么 .NET 不允许将整个类标记为非序列化?

--

我最终通过让处理程序实现 ISerializable 并且在序列化构造函数/GetDataObject 方法中不执行任何操作来解决这个问题。但是,处理程序仍然是序列化的,只是它的所有依赖项都设置为 null - 所以我也必须考虑到这一点。

是否有更好的方法来防止整个类的序列化?也就是说,一种不需要考虑空依赖项的方法?

最佳答案

虽然我倾向于不同意这种方法(我只是将事件标记为非序列化,而不管有多少),但您可以使用序列化代理来做到这一点。

想法是您创建一个实现 ISerializationSurrogate 的对象,并且基本上执行您已经在执行的操作 - GetObjectData 和 SetObjectData 方法中没有任何内容。区别在于您将自定义委托(delegate)的序列化,而不是包含它的类。

类似于:

class DelegateSerializationSurrogate : ISerializationSurrogate {
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
// do nothing
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context) {
// do nothing
return null;
}
}

然后您使用过程 outlined in this MSDN column 向格式化程序注册它.然后,每当格式化程序遇到委托(delegate)时,它都会使用代理而不是直接序列化委托(delegate)。

关于c# - 为什么不能在类级别使用 'NonSerialized' 属性?如何防止类的序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2467376/

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