c# - 如何从文件读取/写入 C# BigIntegers?

标签 c# serialization biginteger

在我的一个类(class)中,我有一个读取和写入 Decimal 类型数组的例程(使用 BinaryReader/BinaryWriterReadDecimal()Write() 方法,即:

BinaryReader inputReader = new BinaryReader(File.OpenRead(BaseFilePath));
for (int x = 0; x < 6; x++) {
    for (int y = 0; y < m_Codes[x].GetLength(0); y++) {
        for (int z = 0; z < m_Codes[x].GetLength(1); z++) {
            m_Codes[x][y, z] = inputReader.ReadDecimal();
        }
    }
}

for (int x = 0; x < 6; x++) {
    for (int y = 0; y < m_Codes[x].GetLength(0); y++) {
        for (int z = 0; z < m_Codes[x].GetLength(1); z++) {
            outputWriter.Write(m_Codes[x][y, z]);
        }
    }
}

.. 如您所见,在设计时只有第一个维度是已知的,其他维度在运行时会有所不同。

在一个完美的世界中,我会将 ReadDecimal() 替换为 ReadBigInteger() 和类似的书写方法,但似乎不支持流类;我猜这是因为 BigInteger 可以是任意长度。

关于我能想到的最好的事情是“手工编码”BigInteger,将其转换为 byte[] 数组,然后写入该数组的长度,然后将每个字节写入数组本身(并反向读取它)

两个问题:

1) 这是更好的方法吗?

2) 我的主要动机是提高绩效; boes BigInteger 甚至比 Decimal 表现得更好,如果有的话?

最佳答案

有一种相当简单的方法:调用 BigDecimal.ToByteArray序列化,以及 BigDecimal(byte[])反序列化时的构造函数。不可否认,这最终会复制数据,但我仍然希望它相当快。

你更关心序列化性能还是算术性能?

至于 BigIntegerdecimal 之间的任何速度差异 - 您应该针对您实际想要执行的操作对其进行测试,注意它们的行为会有所不同(例如除法3 x 2 显然会为每种类型给出不同的答案)。

关于c# - 如何从文件读取/写入 C# BigIntegers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799098/

相关文章:

java - 在Java中,如何获得索引长度为10^5位的数字字符串的子序列

Golang 大整数到二进制字符串

c# - 在哪里可以找到设计良好的小型 C# 应用程序的源代码(用于学习目的)?

c# - 失去焦点时的 WPF RaisePropertyChanged 事件

c# - Winforms C# 使用正则表达式搜索文本文件,找到匹配项,并在文本框中获取该匹配项的下一行

java - Java 对象序列化时哪些因素控制文件大小

java - 序列化/反序列化公共(public)枚举的简单方法?

java - SpringFramework ResponseBody 返回具有空值的对象

c# - HttpModule 和静态类,多个请求共享同一个静态数据吗?

java - 将 BigInteger 与 BigDecimal 进行比较