c# - .NET System.IO.BinaryWriter 写入的原始字节是否可由其他平台读取?

标签 c# .net serialization f# rust

背景

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

问题

我可能需要在其他编程语言(如 Java 和/或 Rust)中使用序列化格式。他们是否能够理解 System.IO.BinaryWriter 编写的原始二进制文件并以类似于 .NET 的“System.IO.BinaryReader”的方式读取它?

(我假设新平台(Java/Rust)将隐含地知道原始二进制文件的写入顺序。)

补充信息

我知道 protocol buffers 是一种高性能和语言不可知的框架,用于在这种情况下进行序列化/反序列化,但是: (1) 我正在使用 F#,它与受歧视的工会斗争 (2) 编写我自己的自定义序列化程序并不需要太多努力,因为我的类型不太复杂

最佳答案

这取决于您使用 BinaryWriter 编写的类型。

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

关于c# - .NET System.IO.BinaryWriter 写入的原始字节是否可由其他平台读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33797958/

相关文章:

c# - 电子邮件的显示选项

c# - Entity Framework SqlQuery 选择 LONG RAW 到字节数组

.net - 如果使 IE8 模拟 IE7 的 head 标签不起作用怎么办?

C# LINQ 使用值列表按子列表过滤复杂对象列表

c# - 从类中分解所有依赖项的最简单、最快的方法

.net - 获取 WPF 窗口中当前聚焦的元素/控件

c# - 如何确定类是否具有 DataContract 属性?

java - 我怎样才能使这个序列化工作?

java - 如何在 Jackson 中使用自定义序列化程序?

c# - "COM object that has been separated from its underlying RCW cannot be used"与 .NET 4.0