问题标签 [binaryformatter]

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 投票
1 回答
2786 浏览

c# - 命名管道传输的可序列化包装类

我正在尝试使用命名管道创建跨应用程序 asp.net 缓存服务(类似于 memcached 或 AppFabric/Velocity)。基本前提是您可以获取或设置在连接到命名管道的任何其他应用程序之间共享的缓存项。

其中一部分要求您发送到缓存的对象被序列化为 byte[] 以方便 PipeStream.Read() 和 PipeStream.Write() 方法。由于缓存将保存任意数量的任意对象类型/类,我不想在每个对象上都设置 [Serializable] 属性,因此我选择创建一个 [Serializable] 的包装类并具有我可以用来传输缓存项的通用对象类型字段,类似于此处使用的方法:http ://www.eggheadcafe.com/articles/20060404.asp

一切似乎最初都适用于内置类型,但现在我正在尝试发送一个 List<> 的自定义类型(一个类)的对象,并且我遇到了一个异常,我的自定义类需要是 [可序列化] ...这是我试图避免的。

这是代码:

服务器-

客户端方法(在静态类中)-

共享代码:

最后是导致问题的特定用例:

像这样使用:

抛出的异常是在调用 bf.Serialize(ms,this) 时的 ToBytes() 方法中,它说:“在 Assembly 'API 中键入 'MemCachedSession',版本 = 1.0.0.0,Culture=neutral,PublicKeyToken=null'未标记为可序列化。'"

(编辑)为什么会这样,和/或我什至在做我想做的事情的正确轨道上?(编辑)

整个想法是封装类(CacheAction)将是可序列化的,以防止这种情况,这在某种程度上确实有效,但不适用于这个自定义类(MemCachedSession)。

很抱歉这个大问题,也许答案也不简单(即整个方法是错误的),但如果有人能花时间提供一些见解,我们将不胜感激!谢谢,

0 投票
1 回答
2748 浏览

c# - BinaryFormatter.Deserialize 的 OutOfMemory 异常来自其内部 StringBuilder 调用

我有一个 .NET 4 WCF 服务,它正在向客户端发送一些被客户端反序列化的大对象(~115Mb)。对象第一次进入它时反序列化很好。但是,所有后续调用都会抛出OutOfMemoryException. 我已经检查以确保我的所有东西IDisposables都包裹在using块中。我已经查看了与此类似的其他问题,例如BinaryFormatter outofmemory 异常反序列 化和Deserialize from MemoryStream throws OutOfMemory exception in C# 。我尝试了一些人们推荐的解决方案,包括使用Simon Hewitt 的 Optimized Serializer。但是,最终,他仍然依赖于BinaryFormatter反序列化对象。

我抓住OutOfMemoryException并查看了堆栈跟踪(见下文)。跟踪似乎源于StringBuilder类中的内存利用率问题。我已经阅读了其他文章,关于如何StringBuilder在需要更多空间时使用 (length * 2) 算法导致内存问题。

有没有办法以BinaryFormatter不同的方式工作而不使用StringBuilder,或者有没有更好的替代方法来BinaryFormatter更好地管理内存?

0 投票
0 回答
981 浏览

c# - 如何在 binaryformatter 反序列化期间追踪重复键异常的原因?

在尝试反序列化由 BinaryFormatter 创建的文件时,会引发以下异常:

ArgumentException:已添加具有相同键的项目。

堆栈跟踪从 BinaryFormatter 中的 Deserialize 方法开始,我无法确定代码中的哪个类导致了冲突。

我正在序列化 100 多个标有[Serializable]属性的类

我看到另一个问题表明原因可能与具有重复名称的字段有关。但是,我在 100 多个类中找不到导致冲突的字段,并且除了手动梳理代码之外,我不知道还有一种更有效的方法来追踪它。

除了手动检查每个班级的字段之外,还有更好的方法来开始调试这个问题吗?首先,碰撞可能有不同的原因吗?我非常感谢可以提供的对此问题的任何见解。

异常内容

0 投票
3 回答
2217 浏览

c# - 您如何识别导致二进制序列化在 .NET 中失败的字段?

我正在尝试使用以下方法在 .NET 中序列化对象图:

但是,我遇到了以下错误:

有没有一种直接的方法来确定哪个字段产生了这个错误?我可以递归地将对象图中的字段标记为 NonSerialized 以缩小潜在的罪魁祸首,但由于对象图非常广泛,这很麻烦而且似乎没有必要。

请注意,我不确定为什么 BinaryFormatter 不能序列化对象图中的一个或多个值。如果对象可以在运行时存储在内存中,不清楚为什么它不能被序列化。这可能是枚举的问题吗?

0 投票
1 回答
5302 浏览

c# - OnSerializing/OnSerialized 方法并不总是被调用

这是我在项目中序列化的结构:

nonserializable3rdPartyClass虽然没有标记为,但[Serializable]提供了我在我的和.ToXml方法中使用的方法 ,分别用于在 中存储和检索 XML 字符串。.FromXml.OnSerializing.OnDeserializedxmlof3rdPartyData

我最近遇到了一个问题,在某些未知情况下(到目前为止,我只能使用来自客户的序列化数据文件重现该问题,该客户首先报告了该问题),我的.OnSerializing.OnSerialized方法仅被称为 57 /160 次(其中 160 是结构中对象的总数D),当使用 aBinaryFormatter序列化到文件时,留下 103 个设置为 的D对象。使用此处描述的方法克隆结构时(这与我用来序列化到文件的方法基本相同),我看到/的结果相同,但我的方法被调用了 160 次。xmlOf3rdPartyDatanull.OnSerializing.OnSerialized.OnDeserialized

这段代码已经使用了几个月没有问题(至少据我所知),我仍在试图确定为什么现在而不是更早发生这种情况。在调试时我没有看到任何第一次机会异常,而且我在方法开始时的断点根本没有被击中超过 57 次。关于为什么会发生这种情况/如何解决它的任何想法?

0 投票
2 回答
3316 浏览

c# - 二进制序列化不起作用,无效标头

我得到了以下内容,而不是复杂的代码,无论如何我在反序列化时遇到异常。例外情况是:二进制流“0”不包含有效的 BinaryHeader。可能的原因是无效的流或序列化和反序列化之间的对象版本更改。

但我不明白我的代码有什么问题

0 投票
1 回答
639 浏览

c# - 反序列化不会传输我的布尔值

我正在尝试学习 C# 中的套接字,并决定创建一个多人游戏进行练习。虽然我在套接字发送方面已经取得了很大进展,但我遇到了一个奇怪的问题,即在从另一个客户端接收并反序列化我的类后,布尔值总是变为真。

问题出现在这里:

Game.ScoreBoard[currentPlayer].Local总是为真,我完全不确定问题出在哪里。其他值似乎工作正常。Connection 是一个包含 IP、套接字和管理连接等的类。缓冲区大小当前为 30 000,因为我尝试扩大它以确保这不是问题。

以下是课堂上的相关信息:

这是序列化程序类:

我不知道该怎么做,或者即使提供的信息足以让您解决我的问题。如有必要,我可以提供更多信息。我只是觉得奇怪的是,似乎只有那个布尔值无法正常工作。

编辑:我发现了问题,像往常一样,这是一个简单的愚蠢错误。哦,好吧,我至少学会了制作自己的二进制格式化程序。多谢你们 :)

0 投票
1 回答
613 浏览

c# - 如何在 C# 中序列化 StrokeCollection

我想为此目的在内存流中保存一个 Stroke 使用 BinaryFormatter 但是当我尝试序列化 Stroke 时出现一个错误,我无法序列化 Stroke

有什么方法可以将 Stroke 保存在内存流中或序列化 Stroke?

这是我的代码的一部分

谢谢。

0 投票
1 回答
2748 浏览

c# - 如何反序列化 BinaryFormatter

我正在尝试将我的 MMF 序列化为文件,这是代码:

在反序列化部分我收到错误:

mscorlib.dll 中出现“System.Runtime.Serialization.SerializationException”类型的未处理异常

附加信息:二进制流“0”不包含有效的二进制标头 BinaryHeader。可能的原因:无效的流或序列化和反序列化之间的对象版本更改。

如何正确反序列化文件?我的错误在哪里?

谢谢你

0 投票
1 回答
3460 浏览

c# - 将 gZipStream 与一个或两个内存流一起使用会产生很大的不同

我肯定遗漏了一些非常明显的东西,但谁能解释为什么在第二种情况下压缩率要好得多?!

案例 1:非常低的压缩率,有时甚至会增长。

案例 2:更好的压缩并且我没有得到尺寸增长。

我已经完成了镜像解压缩,在这两种情况下,我都可以将其反序列化为源对象而不会出现任何问题。

以下是一些统计数据:

UncSize: 58062085B, Comp1: 46828139B, 0.81%

UncSize: 58062085B, Comp2: 31326029B, 0.54%

UncSize: 7624735B, Comp1: 7743947B, 1.02%

UncSize: 7624735B, Comp2: 5337522B, 0.70%

UncSize: 1237628B, Comp1: 1265406B, 1.02%

UncSize:1237628B,Comp2:921695B,0.74%