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

时间:2015-05-24 10:38:47

标签: c# serialization binary

在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班怎么样?

1 个答案:

答案 0 :(得分:2)

  • BinaryWriter的endianess是固定的。它总是小端。
  • 每种数据类型的整数大小始终相同:byte/sbyte 1B short/ushort 2B int/uint 4B long/ulong 8B
  • Floats and Doubles遵循IEEE Standart
  • 使用BinaryReader/BinaryWriter进行阅读和写作会带来相同的结果。从C#到Java,您需要翻转所有传入的字节,因为Java正在使用BigEndian
  • BinaryFormatter用于序列化或反序列化同一台PC上的对象。将数据从一台PC传输到另一台PC时不应使用它。

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

相关问题