背景
我正在使用 System.IO.BinaryWriter
手动将大数据 block 写入二进制文件。我之所以选择它,是因为与各种其他序列化和反序列化方法相比性能有所提高(我目前正在使用 System.IO.BinaryReader
进行反序列化)。
问题
我可能需要在其他编程语言(如 Java
和/或 Rust
)中使用序列化格式。他们是否能够理解 System.IO.BinaryWriter
编写的原始二进制文件并以类似于 .NET 的“System.IO.BinaryReader”的方式读取它?
(我假设新平台(Java/Rust)将隐含地知道原始二进制文件的写入顺序。)
补充信息
我知道 protocol buffers 是一种高性能和语言不可知的框架,用于在这种情况下进行序列化/反序列化,但是: (1) 我正在使用 F#,它与受歧视的工会斗争 (2) 编写我自己的自定义序列化程序并不需要太多努力,因为我的类型不太复杂
最佳答案
这取决于您使用 BinaryWriter
编写的类型。
byte
、sbyte
和byte[]
:没问题。(U)IntXX
:字节序问题。 .NETBinaryWriter
以小端格式转储这些类型。float
和double
:如果两个系统都使用相同的 IEEE 754 标准,并且两个系统都使用相同的字节顺序,那么就没有问题。decimal
:这是特定于 .NET 的类型,类似于Currency
但使用不同的格式。谨慎使用。char
和char[]
:使用BinaryWriter
的当前Encoding
。两边使用相同的编码,一切正常。string
:字符串的长度以所谓的 7 位编码 int 格式编码(1 字节最多 127 个字符等),< em>and 使用当前编码。为了使事情兼容,也许您应该使用手动转储的长度信息转储字符数组。
关于c# - .NET System.IO.BinaryWriter 写入的原始字节是否可由其他平台读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33797958/