问题标签 [iserializable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
10543 浏览

c# - 未调用反序列化构造函数

我正在尝试序列化/反序列化包含Dictionary<Tuid,Section>. 这些都是自定义类型。

在我的代码中,我有一种模板类型,其中包含Dictionary<Tuid,Section>. 这是我试图序列化/反序列化的模板类。

为了解决这个集合是字典的问题,我ISerializable在我的模板类上实现了接口......

这里的策略是将字典“解包”成两个单独的列表,并将它们单独存储在序列化流中。然后它们会在之后重新创建。

我的Section课程也实现ISerializable了......

问题是当我在我的模板GetObjectData()我的部分上都调用序列化时,这让我相信数据是可序列化的并且它正在被序列化。

当我反序列化时,只会调用 Template 上的反序列化构造函数。Section 的反序列化构造函数永远不会被调用。这样做的结果是调用info.GetValue("Section_Values"....) 确实返回了一个 List,但其中有一个项目并且该项目为空。

为什么我的反序列化 Section 的构造函数永远不会被调用?会不会是部分里面的一些数据是不可序列化的?如果是这样,如何找出它不能序列化的究竟是什么?

更新:我刚刚发现的一件事是 BaseObject for section 被标记[Serializable]但没有实现ISerializable.

此外,我想知道 Deserialize 代码有多么繁琐——它是否会针对同时构造基类的构造函数?

更新..

好的,我已经将问题追溯到该部分的序列化。代码看起来像这样......

注释掉这两行后,没有任何内容被序列化,并且调用了反序列化构造函数Section。如果我添加字符串值,一切都很好。但是,是的 - 你猜对了 - 如果我将 加入CustomObject到序列化流中,则不会调用反序列化构造函数。

注意...

  • 我的反序列化构造函数Section是一个空白方法 - 我不尝试对反序列化数据做任何事情。
  • Section 的基本构造函数已被删除以传入新的有效对象,我已经确认它运行良好。
  • 没有抛出异常告诉我CustomObject无法序列化。
  • 是可序列化的CustomObject,其GetObjectData()方法运行良好,反序列化构造良好。

纯粹将这个可序列化对象添加到框架然后只是失败的反序列化器构造函数的流中似乎很奇怪Section

为什么这可能会发生?

0 投票
1 回答
1037 浏览

c# - C# 是否将反序列化构造函数调用为默认构造函数的 INSTEAD?

我刚刚熟悉 C# 中对象的序列化。我想知道反序列化构造函数是否被称为 INSTEAD OF 默认构造函数或 IN ADDITION TO。如果是 IN ADDITION TO,这些调用的顺序是什么?例如:

0 投票
1 回答
1645 浏览

c# - 列表的序列化使用 ISerializable

谢谢参观!

我正在开发在现场部署的产品的新版本。我需要保持从旧软件反序列化现有文件的能力。

这是一个人为的例子:

我有一个现有的客户群,其中包含他们需要访问的序列化文件。出于这个问题的目的,他们有一个“动物园”文件,其中包含长颈鹿列表。

现在,我们正在部署我们的“动物园”软件的新版本,我们将支持长颈鹿以外的动物,我们应该一开始就这样做,但由于时间限制,我们不得不发布 1.0 与长颈鹿-唯一的功能集。

我正在使用自定义 serializationBinder 将旧 Giraffes 反序列化为 Animals

问题是我不想让我的 Zoo 类使用 List 作为存储,而不是 List。我想这样做有两个原因,还有为了未来的可扩展性,以便我可以更轻松地模拟单元测试。

反序列化新的 IAnimal 列表没有问题。当我想反序列化旧样式项目时,问题就来了。Binder 返回了正确的类型,调用了正确的反序列化构造函数,看起来一切正常,但 List 实际上充满了 null 项。一旦调用了 IDeserializationCallback.OnDeserialization 回调,列表就是正确的。我不能简单地调用 IEnumerable.ConvertAll<>() ,因为看起来序列化框架在返回以清理所有内容时试图找到完全相同的实例,并且 ConvertAll 将创建一个新列表。

我现在已经可以使用它了,但是我希望有人可以帮助我清理它,因为到目前为止它还不是那么可维护的。这是执行此操作所需的:

这是一个基本的测试控制台应用程序,显示了两种情况的序列化和反序列化:

任何建议将不胜感激。我很难在这类事情上找到好的资源。谢谢!

0 投票
1 回答
1383 浏览

c# - ISerializable - 序列化单例

ISerializable 接口只提供了一种序列化对象的方法。反序列化过程由构造函数管理。

问题是,构造函数不能返回实例,因为构造函数创建了一个新实例。

在我的实现中,有几个属性对应于在其他地方实例化和维护的单例。

我需要反序列化过程来获取该实例并分配给属性,而不是创建一个新实例。

构造函数方法不适合这种情况。

在 Java 中,您将调用 ReadResolve() 方法,是否有 C# 等效项?

0 投票
1 回答
883 浏览

c# - 子类化 DataTable 在序列化/反序列化期间将 DataType 信息从 Double 更改为 String

作为这个问题的背景,我想将“制作的代码”绑定DataTableaspx:GridView. 为了持久化这个表,我实现了ISerializable接口。该表显示正确,但在对行进行排序的回发中,InvalidCastExcpetion由于 row.ItemArray 中的元素从 type 更改为 type double,因此引发了 a string

这是课堂。注意:两个构造函数,一个用于初始化DataTable,一个用于在反序列化过程中构建表:

正如我通过阅读SerializationInfo构造函数中的架构可以观察到的那样HeatMapVisualisationDataTable(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext ctxt),该表已正确序列化,并且就序列化的 xml 架构而言,该表是从“存储”正确的。但是,查看此构造函数中构造的基类,序列化之前类型的所有列double现在都是类型string。我究竟做错了什么?

更新 1:我还可以通过将数字数据类型从更改doublefloat或来重现此问题decimal。类型的主键列Guid被反序列化为正确的类型。

更新 2DataTable.ReadXml() :在我看来,所描述的行为是对列的 DataTypes 被 String 替换的一些问题的跟进。

谢谢,扬

0 投票
0 回答
356 浏览

silverlight - Silverlight 5 中的自定义反序列化

我试图弄清楚如何在 Silverlight 应用程序中实现自定义序列化/反序列化逻辑。在标准的 .NET 应用程序中,我可以简单地实现 ISerializable 来控制对象的序列化方式,并提供“反序列化构造函数”(SerializationInfo、StreamingContext)来处理反序列化时的传入数据。

因为 Silverlight 不支持 ISerializable,有没有其他方法可以做到这一点?

0 投票
1 回答
1131 浏览

inheritance - 如何使用:1. ISerializable 与 Serializer.Merge/Serialize & 2. ProtoInclude 与 RuntimeTypeModel.Default?

我将我的项目翻译为使用 protobuf-net 而不是 BinaryFormatter。看起来缺少文档http://code.google.com/p/protobuf-net/w/list我还从http://code.google.com/p/protobuf-net 查找了一些示例/source/browse/ 但是有些事情对我来说仍然不清楚,这就是我决定在这里问的原因:

1.关于ISerializable和Serializer.Merge/Serialize

如果我们从 ISerializable 继承来进行特定的序列化。正如我从:ProtoBuf-Net ProtoInclude Generic Type Subclass中读到的, 我们必须使用钩子 Serializer.Merge/Serialize;

假设我们有类:

Serializer.Merge(info, this) ; 必须添加到构造函数Anchor(SerializationInfo info, StreamingContext context)

Serializer.Serialize(info, this); 添加到void GetObjectData(SerializationInfo info, StreamingContext context)

所以,我们有:

问题: 这是正确的吗?(“信息”被序列化程序覆盖?即 binaryformatter 将无法正常工作?目前我只是尝试使用 protobuf-net,我更愿意让 binaryformatter 也能正常工作)

2.关于使用ProtoInclude和RuntimeTypeModel.Default

假设我们有作为类基础的 Message类:Ack 类、HandshakeClientInfo 类... Command 类。如果我们想序列化 Message 的子类,正如我所读到的那样:protobuf-net 的 [ProtoInclude(1, "MyClass")] 不起作用 ,我们应该使用 ProtoInclude (“告诉”基类:关于它的子类的消息类)以防万一如果我们在编译时知道子类型 - 没关系。

对于那些我们在编译时无法确定的类型(因为它在另一个项目中),我们应该使用RuntimeTypeModel.Default[typeof(Message)].AddSubType(207, typeof(Command)); 或使用 Type.AssemblyQualifiedName: [ProtoInclude(207, "Trainer.Commands.Command, Simulator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")]

我使用 protobuf-net v2 (r580) 和带有RuntimeTypeModel.Default[typeof(Message)].AddSubType(207, typeof(Command)) 的变体;似乎更可取。

问题: 但我不明白它应该放在代码中的什么位置?在构造函数或....?可以同时使用ProtoIncludeRuntimeTypeModel.Default吗?

0 投票
0 回答
78 浏览

c# - 序列化“ClassName”类,具有属性 typeof(Encoding) c#

如果它看起来很愚蠢,我很抱歉,但我真的不明白如何序列化我自己的具有属性的类:

有人可以解释解决我的问题的最佳方法是什么吗?

0 投票
0 回答
832 浏览

c# - 自定义序列化 - 反序列化的 ISerializable 和受保护/私有构造函数

我不明白它是如何工作的:当我实现 ISerializable 接口时,我必须定义受保护的(除非类是密封的,在这种情况下构造函数应该标记为私有)构造函数:
protected MyClass(SerializationInfo info, StreamingContext context)
这个访问修饰符使这个构造函数对项目那么反序列化如何成功?

0 投票
1 回答
126 浏览

c# - Linq-to-SQL 覆盖我的 OnSerializing 属性

我的代码

Linq 到 SQL

结果

无效的属性。“AuthenticationManager.User”类型中的“Void ClearPassword()”和“Void OnSerializing(System.Runtime.Serialization.StreamingContext)”都有“System.Runtime.Serialization.OnSerializingAttribute”。

现在,微软的工程师们是否创造了一种方法,让两个独立的代码块在序列化时独立触发一些事件?特别是考虑到他们劫持了这个事件来设置的事实this.serializing = true

提前致谢。