问题标签 [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 投票
0 回答
145 浏览

c# - 使用 ISerializable 使用循环引用序列化事件

我必须处理序列化一堆对象。为了简单起见,我将[Serializable]属性与二进制序列化程序和二进制格式化程序一起使用,不包括大多数内容的非必要字段[NonSerialized]。对于更复杂的部分,我实现了ISerializable接口 + 反序列化构造函数。即使有循环引用(以普通对象引用的形式),这也很有效。

现在我偶然发现了一些让我有点困惑的东西。当一个类B实现ISerializable,并且被另一个类引用(让我们命名它Container)订阅该类的事件时,序列化时恰好调用了两次GetObjectData-Method 。B

所以这个示例代码写

对于循环效果的问题,我宁愿期待堆栈溢出或其他东西:-)。总之不好。此示例的解决方法当然是在反序列化构造函数中重新添加事件。但我想了解造成这种情况的原因。

最后一件事:如果将上面 lambda 表达式中的引用更改为以下内容(引用参数,而不是字段)......

...序列化在第一次执行后立即崩溃SerializationExceptionB+<>c__DisplayClass2 未标记为 Serializable )。GetObjectData

任何有关原因(以及有用的解决方法)的提示都表示赞赏。

0 投票
2 回答
173 浏览

c# - ISerializable 循环引用

我一直在尝试了解如何使用 ISerializable 接口正确实现循环引用。但即使是简单的形式我也无法解决,我已经阅读了这里的解释

但我一直无法实现它,我也试过找一个例子无济于事。我已经检查了 MSDN 上的文档,但我无法参考如何使用循环引用处理自定义序列化。

我一直在尝试的最简单的形式是双向链表。

0 投票
2 回答
259 浏览

c# - Socket.Send,服务器收到很多无效的 MPacket

Packet 是我用来保存数据的类,实现了 ISerializable 以及我从 [ http://msdn.microsoft.com/en-us/library/ms182342.aspx]中读取的所有必需的构造函数和函数

我将我的数据包放在一个 dll 中并在服务器和客户端应用程序中引用它,以便他们可以使用 TcpListener 传输数据包(转换为 byte[] 并发送、接收和转换回)

我测试了服务器客户端与单个数据包完美配合,无需发送文件或小于或等于 1mb 文件。这是服务器从客户端收到带有重命名命令的数据包时的日志

每个数据包,它将最大 1mb 长度的字节数组作为文件部分的数据放在 byte[] msgFileData 属性中,TcpListener 接收最大 2mb。

问题是当发送一个超过 1mb 的文件时,我将该文件拆分为每个最大 1mb 的部分,并且只有一些以正确格式接收的数据包,可以反序列化,并且一些是无效的数据包格式。它工作了一点时间,通常会显示这个错误,所以我只能在幸运的时刻上传它

它必须是这样的


**********客户*************

MainForm.cs

用户.cs

上传表单.cs

上传者.cs


********服务器**********

ClientManager.cs // 保存客户端列表

文件上传信息.cs

客户端.cs

真的需要帮助。。

感谢阅读!

0 投票
3 回答
4730 浏览

c# - 扩展 GetObjectData 方法未标记为虚拟的类时的序列化

我正在尝试扩展一个框架。我正在扩展的类之一是序列化的。基类的GetObjectData()方法未标记为虚拟,因此我无法覆盖它。

现在,如果对象在作为基类引用时被序列化,则它不是多态的,因此仅GetObjectData调用基类'。

有没有办法在不修改基类的情况下将GetObjectData其标记为虚拟?

[编辑] 我扩展了类并添加了一个我想要序列化的属性。以下问题的简单示例

执行保存/加载会产生以下错误:

SerializationException: No element named m_child could be found.

0 投票
0 回答
200 浏览

c# - 为什么 System.Delegate 实现 ISerializable?

如果您查看源代码,System.Delegate您会发现它实现了ISerializable接口:

但实际实现会抛出异常:

为什么ISerializable使用;是否有任何派生类型实际上使用序列化?

0 投票
1 回答
859 浏览

c# - ISerializable 与递归子级

我想为包含类似类型子项列表的 C# 类实现 ISerializable。考虑以下示例:

在上面的示例中,Nested.GetObjectData 和 Nested 的序列化构造函数被调用了 4 次,一次又一次。

将子项作为嵌套数组添加到序列化程序将在反序列化时返回正确大小的数组,但所有元素都将为空。

但是,将类型从嵌套数组更改为嵌套列表将在调用子项的构造函数后神奇地修复空元素。

我想知道的是:

  1. 嵌套列表有什么特别之处?
  2. 用这样的递归结构序列化一个类的推荐方法是什么?

更新:

似乎还有一个额外的接口,IDeserializationCallback.OnDeserialization,它在反序列化发生后调用(调用顺序是不确定的)。您可以将反序列化的数组存储在构造函数的临时成员变量中,然后将其分配给此方法中的列表。除非我遗漏了什么,否则这似乎不太理想,因为您必须使用临时变量使您的实现变得混乱。

0 投票
1 回答
63 浏览

c# - 来自基类的自定义 ISerializable

我正在尝试将我的会话保留在 SQLServer 中。我知道一个对象是否需要存储在 SQL 中而不是需要序列化。而且我也知道如果需要,我需要在每个类上放置 [Serializable] 属性。但问题是我有超过 2000 个对象并且还在不断增长。它们紧紧地结合在一起。如果我将其中一个放到会话中,我可能需要为所有这些添加 [Serializable] 属性,这是没有意义的。我想知道的是如何为 ISerializable 接口编写相同的代码,就像基类中的 [Serializable] 属性一样?任何想法?或者我应该将 [Serializable] 添加到每个类。如果我这样做有什么缺点吗?

0 投票
2 回答
838 浏览

serialization - 如何将 ISerializable 对象序列化为 SOAP 或 Json 或 Xml

我有一个 ISerializable 复杂对象,我想将其序列化为 XML 文档(我宁愿不更改源代码并添加 XML 序列化属性的节点)。ISerializable 与 BinaryFormatter 配合得很好,但没有标准的方法可以将其序列化为 XML 或 Json。Json.NET 库确实支持将 ISerializable 对象序列化为 json,但该实现存在一个非常小的问题,即类的可序列化构造函数应该是公共的,以便 Json.net 检测到它(请参阅此问题)这确实使 Json.net 无法用于我的情况。

有没有其他方法可以将 ISerializable 对象序列化/反序列化到 xml、Json 或任何其他平面文本格式?

0 投票
1 回答
241 浏览

c# - 具有接口列表的类的 C# 自定义序列化

我正在尝试找到一种方法来序列化和反序列化下面的 ClassToSerialize,如下所示:

该类将被传递给 API,并且在反序列化时,需要重新构建 Foo1 和 Foo2 的实例并将其放入“Foo”属性中,并沿链向下放入 IList< IFoo > 或类似对象中。

我已经坚持了一天左右,我没有想法!

0 投票
1 回答
314 浏览

c# - C#:实现 ISerializable 时的 [NonSerialized]

在类上实现时,我不了解该[NonSerialized]属性的使用ISerializable。我参加了“C# 编程”(Microsoft 20-483)课程,它在几个示例中使用,但没有详细说明。
上这堂课:

我评论了我的期望:_Age是一个我不想序列化的私有字段。我专门写了GetObjectData序列化它。这是一件很奇怪的事情,但我想了解如何[NonSerialized]处理。
如果我在Main

年龄在那里......在序列化对象所在的文件和再水化对象中。我的问题是:为什么?在这种情况下,属性有什么用,因为[NonSerialized] 我们只需要不添加方法?我显然错过了一些东西,但我不知道是什么。谢谢!AgeGetObjectData

编辑:课程中的示例: