C# 面试题 目录

C# 中 BinaryFormatter 和 JsonSerializer 的区别

推荐答案

在C#中,BinaryFormatterJsonSerializer 是两种不同的序列化工具,它们的主要区别如下:

  1. 序列化格式

    • BinaryFormatter:将对象序列化为二进制格式。
    • JsonSerializer:将对象序列化为JSON格式。
  2. 可读性

    • BinaryFormatter:生成的二进制数据不可读,适合存储或传输。
    • JsonSerializer:生成的JSON数据是人类可读的,适合调试和数据交换。
  3. 跨平台兼容性

    • BinaryFormatter:生成的二进制数据通常只能在.NET环境中使用,跨平台兼容性较差。
    • JsonSerializer:生成的JSON数据可以在多种编程语言和平台中使用,跨平台兼容性好。
  4. 安全性

    • BinaryFormatter:存在安全风险,特别是在反序列化不受信任的数据时,可能导致代码执行漏洞。
    • JsonSerializer:相对安全,因为它只处理数据,不会执行代码。
  5. 性能

    • BinaryFormatter:通常比JsonSerializer更快,因为它直接操作二进制数据。
    • JsonSerializer:相对较慢,因为它需要将数据转换为文本格式。
  6. 使用场景

    • BinaryFormatter:适用于需要高性能和紧凑数据存储的场景,如.NET内部的通信。
    • JsonSerializer:适用于需要跨平台兼容性和可读性的场景,如Web API和配置文件。

本题详细解读

BinaryFormatter

BinaryFormatter 是 .NET 框架中的一个类,用于将对象序列化为二进制格式。它可以将对象的状态保存到文件或通过网络传输,并在需要时重新创建对象。BinaryFormatter 的主要特点是:

  • 二进制格式:生成的序列化数据是二进制的,不可读。
  • 高性能:由于直接操作二进制数据,序列化和反序列化的速度较快。
  • .NET 专用:生成的二进制数据通常只能在.NET环境中使用,跨平台兼容性较差。
  • 安全风险:反序列化不受信任的数据时,可能导致代码执行漏洞,因此不推荐使用。

JsonSerializer

JsonSerializer 是 .NET 中的一个类,用于将对象序列化为JSON格式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于Web开发和跨平台通信。JsonSerializer 的主要特点是:

  • JSON格式:生成的序列化数据是JSON格式,人类可读。
  • 跨平台兼容性:JSON数据可以在多种编程语言和平台中使用,跨平台兼容性好。
  • 安全性:相对安全,因为它只处理数据,不会执行代码。
  • 性能:由于需要将数据转换为文本格式,序列化和反序列化的速度相对较慢。

使用场景对比

  • BinaryFormatter:适用于需要高性能和紧凑数据存储的场景,如.NET内部的通信。但由于其安全风险,微软已不推荐使用,并在.NET 5.0及更高版本中标记为过时。
  • JsonSerializer:适用于需要跨平台兼容性和可读性的场景,如Web API和配置文件。由于其安全性和跨平台特性,推荐在现代应用中使用。

代码示例

-- -------------------- ---- -------
----- -------
----- ----------
----- -----------------------------------------------
----- -----------------

------ ----- ------
-
    ------ ------ ---- - ---- ---- -
    ------ --- --- - ---- ---- -
-

------ ----- -------
-
    ------ ------ ---- ------
    -
        --- ------ - --- ------ - ---- - ------- --- - -- --

        -- --------------- --
        --------------- --------- - --- ------------------
        ----- ---- ------ - --- ---------------
        -
            --------------------------- --------
            -------------- ------------------
            --- ------------------ - --------------------------------------
            ------------------------------------ -------------------------- ---------------------------
        -

        -- -------------- --
        ------ ---- - ---------------------------------
        --- ---------------------- - -----------------------------------------
        ----------------------------------- ------------------------------ -------------------------------
    -
-

在这个示例中,BinaryFormatterJsonSerializer 分别用于序列化和反序列化一个 Person 对象。BinaryFormatter 生成的二进制数据不可读,而 JsonSerializer 生成的JSON数据是人类可读的。

纠错
反馈