问题标签 [binary-deserialization]
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.
c# - 为了使二进制反序列化失败,类/对象必须更改多少
我们有一个解决方案,我们将一个相当大/复杂的 C# 对象作为二进制数据存储在我们的数据库中。我担心的是,当对此类进行更改时,我们冒着保存到数据库的数据在代码更改后反序列化失败的风险。
下面是我们用来序列化对象的代码:
这是我们的反序列化方法:
我的问题是,为了使旧对象的反序列化失败,必须改变什么/改变多少?
c# - 带有 ISerializable 的 BinaryFormatter OptionalField
我创建了一个测试可序列化对象:
然后序列化它:
我更改了类,使其具有 OptionalFied 并尝试反序列化旧的序列化对象:
当我更改构造函数以读取新的可选字段时,在“SecondName = info.GetString("secondName");”处抛出异常:
当您实现 ISerializable 时,是否真的不支持 OptionalFieldAttribute?
vb.net - 反序列化时在解析完成之前遇到流结束
在将 BinaryFile 反序列化为 Object 时出现上述错误。我尝试过 set position=0, seek.begin 方法并尝试使用内存流但没有用。每次我遇到同样的问题。任何人都可以帮助我吗?下面是我的序列化和反序列化代码片段
序列化
反序列化
python - 在 python 中解码二进制协议
我正在尝试编写一个简单的 python 客户端来解码从名为sdrdaemon的程序生成的二进制流。
此处描述了该协议(为方便起见,复制如下)。我的理解是前 42 个字节应该包含我想用 python struct模块读取/解码的元帧。
我从一些非常简单的事情开始。
但是我对这种事情不熟悉,无法理解我将如何同步,所以我解码了正确的部分。下面的描述指向 CRC,但我不确定如何去做。一点指导会很棒。一个 github 问题没有得到回应。
此处给出了该协议的完整解释,但也复制如下:
打包
从硬件设备检索的数据块被分割成 UDP 有效负载大小的块。该块序列在下文中称为“帧”。一个称为“元”块的特殊块在帧之前发送。它用于传达有关帧及其随后数据的“元”数据。对此“元”数据计算 64 位 CRC 并将其附加。它用作验证并从数据块中识别“元”块,从而实现同步。实际上,将其与数据块混合的可能性非常低。
一个压缩流可以把从硬件检索到的多个数据块打包在一帧中,以提高压缩效率。因此,可能会出现元数据在同一帧中从一个“硬件”块到下一个块发生变化的情况。在这种情况下,该帧被拆分,并使用来自元数据已更改的块的起始“元”块构造一个新帧。原始帧的第一部分立即通过 UDP 发送。这确保了数据帧和它的“元”块总是一致的。
元数据块
“元”数据块由以下内容组成(以字节表示的值):
总大小为 42 字节,包括 8 字节 CRC。
数据块
当流未压缩时,有效载荷大小的 UDP 块被填充完整的 I/Q 样本,在块的末尾留下一个可能小于 I/Q 样本的未使用间隙。最后一个块仅填充剩余样本。在“元”数据中给出了最后一个块中最大填充块和剩余样本的数量。当然,由于数据流是未压缩的,这些值也可以从样本总数和有效负载大小中计算出来。
当流被压缩时,UDP 块完全被压缩流的字节填充。最后一个块仅用剩余字节填充。完整块和剩余字节的数量在“元”块中给出,否则无法计算这些值。
概要图
未压缩流
编辑::我在发布后不久就放弃了这种方法(支持 SoapySDR),因此无法再真正发表相关评论。
c# - 在完成分析之前检测到结束流
又是我,我还有另一个问题。在某处,我发现了以下代码:
我今天和现在修改了一些类,它总是抛出一个错误,可以这样翻译:(Before completing the analysis was detected ending stream
我不知道正确的翻译,错误信息是我的语言,而不是英文)
我试图str.Position = 0;
在这两行之间插入using
,我在这里的某个地方找到了,但这没有帮助。
有人可以帮我让它再次工作吗?我不知道该怎么办...
c# - 如何将二维二进制对象转换为字典在 C# 中使用二进制格式化程序
我想将 byte[][] 类型的对象转换为字典。
它总是给出错误“在解析完成之前遇到流结束”。
请帮我 。
c# - C# 序列化 - 找不到程序集
我正在研究 C# TCP Server-Client 编程。我的问题很简单,但不知何故我想不通。
我有一个对象我想序列化这个对象通过套接字发送并反序列化客户端。但问题在于反序列化。我用二进制格式化程序序列化对象。实际上我得到了我应该得到的实际字节数组。但不知何故,在反序列化时我得到了
System.Runtime.Serialization.SerializationException:“多服务器,版本=1.0.0.0,文化=中性,PublicTokenKey=Null”程序集找不到。
当我在序列化后尝试在服务器端反序列化时,它没有问题。
我尝试定制也不起作用的活页夹。如果有人可以帮助我,我真的很感激。
binary-serialization - 有线协议序列化
我正在寻找我称之为“二进制序列化器/解串器代码生成器”的东西,因为缺少一个更好的术语,专门允许您指定具有任意位长度的在线格式,然后生成必要的 C/C++以该格式打包/解包数据包的代码。我开始使用带有位字段的结构,但在阅读了这篇文章后,我想知道是否已经有一些东西可以处理所有混乱的问题。我需要处理的示例数据结构:
保持这样的数据结构字段的动机是,它使程序员的工作更容易根据它们在协议中匹配的内容来设置/获取字段,例如。val5 可能是一个有意义的 3 位标志。是的,我可以为整个结构设置两个 32 位值,并且必须使用位掩码和其他东西来跟踪所有内容,但为什么呢?
我知道诸如 Google Proto Buf 之类的东西,但是 AFAIK 这些都专注于程序员端的数据结构,并且不允许您指定特定的位模式 - 想象一下尝试为低级协议创建客户端代码,其中二进制线格式是如何指定的。我发现的最接近的东西是protlr,它听起来很棒,但它似乎不是 FOSS。SO上的其他帖子指向:
- RedBlocks似乎是一个成熟的嵌入式框架的一部分。
- PADS对于我的需求来说似乎非常陈旧且过于复杂。
- binpac听起来很有趣,但我找不到使用它来解析任意位长度(例如 1 位、2 位、17 位字段)的示例,或者它是否也具有序列化方法,因为它似乎专注于单向反序列化用于入侵检测。
除了滚动另一种序列化格式之外,是否有符合我标准的 FOSS 替代方案,或者有人可以为上述结构提供使用这些参考之一的示例?
c# - 将二进制文件中的类型反序列化到不同应用程序中的不同命名空间(C# .NET)
在名为“application1”的应用程序中,我将此结构序列化为二进制:
在名为“application2”的应用程序中,我必须反序列化这个二进制文件,但我的 ClassA 和 ClassB 必须在 namespace2 而不是 namespace1 内。
所以我写了一个序列化活页夹:
我像这样使用它:
这成功地将 namespace1.ClassA 反序列化为 namespace2.ClassA,但未能进一步将列表 od nemespace1.ClassB 反序列化为 namespace2.ClassB 列表。我猜它失败了,因为 ClassB 的列表被封装到 ClassA 中并且 BindToType() 函数没有被“内部元素”调用,它只为 ClassA 调用一次,然后尝试反序列化 ClassA 并且无法提取 ClassB 列表并出现错误:
我不能对 application1 做任何调整(不能改变我做序列化的方式) 我只能调整 application2 中的反序列化逻辑。
我正在尝试为这个特定问题找到解决方案,任何人都有类似的问题,或者可能有关于如何解决这个问题的想法?
谢谢!
c++ - 通过 char* 缓冲区读取 int 行为不同,无论是正数还是负数
背景:我想知道如果我们通过char *
缓冲区获取二进制数据,如何(手动)反序列化它们。
假设:作为一个最小的例子,我们将在这里考虑:
- 我只有一个
int
通过char*
缓冲区序列化。 - 我想
int
从缓冲区取回原件。 sizeof(int) == 4
在目标系统/平台上。- 目标系统/平台的字节序是little-endian。
注意:这纯粹出于一般利益,因此我不想使用任何类似的东西,std::memcpy
因为我们不会看到我遇到的奇怪行为。
测试:我已经构建了以下测试用例:
其中display()
定义为:
我得到的输出是:
我知道测试用例代码很难阅读。简单解释一下:
- 我创建一个
int
. - 我创建了一个
char*
指向先前创建的第一个字节的数组int
(以模拟我有一个真实的int
存储在char*
缓冲区中)。因此其大小为 4。 - 我显示
int
及其二进制表示 - 我显示
int
存储在char*
缓冲区中的每个字节的 和 连接,以比较它们是否相同(由于字节序的目的,顺序相反)。 - 尝试
int
从缓冲区中取回原始文件。 - 我显示了重构
int
的以及它的二进制表示。
我对负值和正值都执行了这个过程。这就是为什么代码不那么可读的原因(对此感到抱歉)。
正如我们所看到的,负值可以成功重建,但它对正值不起作用(我预料5000
到了,我得到了-120
)。
我已经用其他几个负值和正值进行了测试,结论仍然相同,它适用于负数但对正数失败。
问题:我很难理解为什么将 4 连接chars
成int
通过按位移位会改变char
正数的值,而它们与负值保持不变?
当我们查看二进制表示时,我们可以看到重构的数字不是由char
我连接的 s 组成的。
是否与 相关static_cast<int>
?如果我删除它,积分提升规则无论如何都会隐式应用它。但我需要这样做,因为我需要将其转换为一个int
,以免丢失班次的结果。
如果这是问题的核心,如何解决?
另外:有没有比按位移位更好的方法来取回值?不依赖于系统/平台字节序的东西。
也许这应该是另一个单独的问题。