BinaryReader, BinaryFormatter -它们是可移植的吗?

本文关键字:可移植 BinaryFormatter BinaryReader | 更新日期: 2023-09-27 17:50:37

在C, c++中,如果你用二进制的方式写一个整数(例如:fwrite(&someInt,sizeof(int),1,fp))说到文件,如果你想从不同的机器上读取这个整数,你有很多问题要考虑——例如,端序问题,整数大小在其他计算机上可能不同,浮点表示在不同的计算机上可能不同,负整数有不同的表示,等等。因此,直接以二进制模式读写可能无法在不同的计算机上工作。

在下面这个使用二进制阅读器(来自MSDN)的例子中,上述问题是否也适用?

using System;
using System.IO;
class ConsoleApplication
{
    const string fileName = "AppSettings.dat";
    static void Main()
    {
        WriteDefaultValues();
        DisplayValues();
    }
    public static void WriteDefaultValues()
    {
        using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
        {
            writer.Write(1.250F);
            writer.Write(@"c:'Temp");
            writer.Write(10);
            writer.Write(true);
        }
    }
    public static void DisplayValues()
    {
        float aspectRatio;
        string tempDirectory;
        int autoSaveTime;
        bool showStatusBar;
        if (File.Exists(fileName))
        {
            using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open)))
            {
                aspectRatio = reader.ReadSingle();
                tempDirectory = reader.ReadString();
                autoSaveTime = reader.ReadInt32();
                showStatusBar = reader.ReadBoolean();
            }
            Console.WriteLine("Aspect ratio set to: " + aspectRatio);
            Console.WriteLine("Temp directory is: " + tempDirectory);
            Console.WriteLine("Auto save time set to: " + autoSaveTime);
            Console.WriteLine("Show status bar: " + showStatusBar);
        }
    }
}

BinaryFormatter班呢?

BinaryReader, BinaryFormatter -它们是可移植的吗?

  • BinaryWriter的尾序是固定的。
  • 每种数据类型的整数大小始终相同:byte/sbyte 1B short/ushort 2B int/uint 4B long/ulong 8B
  • 浮点和双精度遵循IEEE标准
  • BinaryReader/BinaryWriter读写会得到相同的结果。从c#到Java,你需要翻转所有传入字节,因为Java使用BigEndian
  • BinaryFormatter意味着在同一台PC上序列化或反序列化对象。在将数据从一台PC传输到另一台PC时不应使用。

如果你正在使用两个c#应用程序,只需使用BinaryReader/BinaryWriter,它们是可移植的。如果另一端不是用c#编程的,你很可能需要使用(或编写自己的)类来处理这些问题。