.NET System.IO.BinaryWriter 写入的原始字节是否可以被其他平台读取?

whi*_*box 3 .net c# serialization f# rust

背景

我正在手动将一个大数据块写入一个带有System.IO.BinaryWriter. 我之所以选择它,是因为与各种其他序列化和反序列化方法(我目前正在使用 反序列化)相比性能有所提高System.IO.BinaryReader

我可能需要在其他编程语言(如Java和/或Rust. 他们是否能够理解由System.IO.BinaryWriter.NET 的“System.IO.BinaryReader”编写的原始二进制文件并以类似的方式阅读它?

(我假设新平台(Java/Rust)将隐式了解原始二进制文件的编写顺序。)

侧面信息

我知道协议缓冲区是在这种情况下用于序列化/反序列化的高性能和语言不可知框架,但是:(1)我正在使用 F# 并且它与受歧视的联合斗争(2)这并不是真正的努力编写我自己的自定义序列化程序,因为我的类型不太复杂

Gyö*_*zeg 5

这取决于您使用BinaryWriter.

  • bytesbytebyte[]:没问题。
  • (U)IntXX: 字节序问题。.NETBinaryWriter以小端格式转储这些类型。
  • floatdouble:如果两个系统使用相同的IEEE 754标准,并且两个系统使用相同的字节序,那么就没有问题。
  • decimal: 这是.NET 特定的类型,类似于Currency但使用不同的格式。小心使用。
  • charchar[]:使用当前EncodingBinaryWriter。在双方使用相同的编码,一切正常。
  • string: 字符串的长度以所谓的7 位编码 int格式(1 个字节最多 127 个字符等)进行编码,使用当前编码。为了使事情兼容,也许您应该使用手动转储的长度信息转储字符数组。