gpt4 book ai didi

c# - 强制 (BinaryFormatter) 序列化器在 ISerializable 时使用 SerializableAttribute 语义?

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

我正在尝试学习使用 C# 序列化将对象保存到可以重新加载回对象的文件中。

我测试过的像这样的普通类

[Serializable()]
public class PlainClass
{
public string Name;
private int Age;
protected decimal Price;
}

可以直接BinaryFormatter.Serialize()和BinaryFormatter.Deserialize()不报错。 (顺便说一句,私有(private)和 protected 属性也会被序列化,尽管文档说只有公共(public)属性)

但是当它实现 ISerialization 或继承某个实现 ISerialization 的类(如 Hashtable)时,你知道什么反序列化构造函数是必需的。 “实现”这个词或概念用词不当,因为 Hashtable 实际上并不实现该构造函数。

有没有办法退回到仅由属性提供的“自动”序列化/反序列化?或者是否有更简单的方法来为一个类中的一百个属性编写 info.GetValue()?

最佳答案

您的帖子中存在很多的困惑:

by the way, the prive and protected properties also get serialized although the docs say only public)

我怀疑您混淆了两个不同的序列化程序; BinaryFormatter 一直被记录为以字段为中心。它不区分公共(public)/私有(private),并且从不查看属性:仅查看字段。相比之下,XmlSerializer 只查看公共(public)属性和字段。

The word or concept of "implement" becomes a misnomer because Hashtable does not actually implement that constructor.

是的,确实如此;它是一个 protected 构造函数:

protected Hashtable(SerializationInfo info, StreamingContext context)
{...}

如果您继承Hashtable,您可以链接到这个构造函数:

protected YourType(SerializationInfo info, StreamingContext context)
: base(info, context)
{ /* your extra data */ }

但是请注意,除非您使用的是 .NET 1.1,否则您可能不应该经常使用 Hashtable

Is there a way to fall back to the "auto" Serialization/Deserialzation provided only by the attribute?

没有;没有。

Or is there an easier way to write info.GetValue() for a hundred properties in a class?

在继承数据的情况下,您可以链接基础构造函数或切换到封装而不是继承 - 要么避免需要担心您自己以外的数据。

但是请注意,我几乎总是反对 BinaryFormatter - 它可能很烦人,而且版本控制很古怪。对于 BinaryFormatter 的每一个烦恼,我都使用 protobuf-net(我会,因为我写了它)——这通常使序列化更可控(并且更有效),并且包括ISerializable 钩子(Hook),如果你真的想使用 BinaryFormatter(即它可以使用 BinaryFormatter 作为包装器,但是protobuf-net 负载)。

关于c# - 强制 (BinaryFormatter) 序列化器在 ISerializable 时使用 SerializableAttribute 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089022/

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