【问题标题】:Two identical files have different file size based on the way it is written from C#根据从 C# 编写的方式,两个相同的文件具有不同的文件大小
【发布时间】:2012-04-10 13:12:43
【问题描述】:

我正在尝试将序列化为 JSON 格式的对象数组写入文件。我正在尝试以两种不同的方式编写它,如下所示。

ToSerialise[] Obj = new ToSerialise[10];
        for (int i = 0; i < 10; i++)
        {
            Obj[i] = new ToSerialise();
        }

        //First form of serialising
        UnicodeEncoding uniEncoding = new UnicodeEncoding();
        String SerialisedOutput;
        SerialisedOutput = JsonConvert.SerializeObject(Obj, Formatting.Indented);
        FileStream fs1 = new FileStream(@"C:\file1.log", FileMode.CreateNew);
        fs1.Write(uniEncoding.GetBytes(SerialisedOutput), 0, uniEncoding.GetByteCount(SerialisedOutput));
        fs1.Close();

        //Second form of serialising
        FileStream fs2 = new FileStream(@"C:\file2.log", FileMode.CreateNew);
        StreamWriter sw = new StreamWriter(fs2);
        JsonWriter jw = new JsonTextWriter(sw);
        JsonSerializer js = new JsonSerializer();
        jw.Formatting = Formatting.Indented;
        js.Serialize(jw, Obj);
        jw.Close();
        fs2.Close();

即使两个文件的内容相同,它们的文件大小也不同。实际上,第一个文件的大小正好是第二个文件的两倍。我尝试使用 textpad 比较输出,它说它们完全一样。为什么它们的文件大小不同?

我在 Windows 7 32 位 .Net4 上运行它

谢谢

【问题讨论】:

  • 您是否尝试过打开在 WinHex 或类似文件中生成的两个文件?这可以让您在原始十六进制中识别它们之间的差异,并可能帮助您找出导致它们以不同文件大小保存的原因。
  • “两个相同的文件具有不同的文件大小”。这只是术语上的矛盾。
  • @EJP 没错,没错,但一些文件比较实用程序显示的文件相同。我现在也有同样的问题。问题是如何(在我的情况下,第二个文件的大小约为 200%!)。

标签: c# json serialization file-io encoding


【解决方案1】:

即使两个文件的内容相同,它们的文件大小也不同。

如果它们有不同的大小,那么它们肯定有不同的内容。一个文件(几乎)只是一个字节序列——如果两个序列的长度不同,它们就是不同的序列。

在这种情况下,两个文件都表示相同的文本,但使用不同的编码 - file2 将使用 UTF-8,file1 将使用 UTF-16。

换一种方式来考虑:如果您将同一张图片保存到两个文件中,一个为 JPEG,一个为 PNG,您是否希望两个文件大小相同?

【讨论】:

  • 感谢您的快速回答!现在我看到文件属性,它分别表示 ANSI 和 Unicode。
  • @Manoj:“ANSI”在这里只是一个猜测(在这种情况下它甚至不是一个精确的术语)。它真的使用 UTF-8 - 但如果您的文本仅包含 ASCII,那么您可以使用任何兼容 ASCII 的编码来读取它,并且您会得到相同的结果。
  • 我现在有点困惑。 UTF-8 意味着它使用 8 位来表示每个字符?我认为 ASCII 有 256 个字符,所以它们匹配。 UTF-16 将允许 65536 个字符变体,因此有空间来表示更多脚本。这是正确的吗?但现在我看到维基百科,我看到 Unicode 可以用 UTF 8 和 UTF 16 表示。那是怎么回事?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 2015-11-18
  • 2018-12-14
  • 2020-06-02
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多