Java 中的转换、解析和序列化:有什么区别?

Casting vs Parsing vs Serialization in Java: What are the differences?

这 3 个术语处理从一种形式到另一种形式的转换,这看起来相似且令人困惑。一般来说,哪些独特的特征使它们与众不同?在什么情况下应该分别使用什么?

它们的相似之处在于所有 3 个都处理将数据从一种表示形式转换为另一种表示形式(几乎,转换引用类型有点特殊)。

1。选角

在 Java 中,转换会做两件不同的事情,具体取决于您是转换引用还是原始值:

  • 转换引用只是改变了引用的类型,它不会改变对象的任何内容。例如:

      Object a = "a string constant";
      String b = (String) a;
    

    在 运行 之后,此代码 ab 将指向完全相同的对象(String 类型代表值 "a string constant")。不同之处在于 aObject 类型引用,而 bString 类型引用。这会限制您可以调用的内容(因此 a.length() 不起作用,但 b.length() 会起作用)。

    仅当被引用的对象实际上是兼容类型时,转换引用类型才会成功。因此,如果 o 在上面的代码块中被初始化为 new Object(),那么第二行的转换将失败并显示 ClassCastException.

  • 转换原始类型确实可能会更改相关值,具体取决于目标类型的范围和分辨率:

      int i = 1000;
      char c = (char) i;
      byte b = (byte) i;
    

    此处 int1000 被转换为 charbyte。第一个演员让 c 等于 1000。但是 byte 不能保存值 1000,所以它会被截断为 -24.

2。解析

Parsing 是关于将文本数据转换为更具体的表示形式。最简单的解析示例是这样的:

String s = "1000";
int i = Integer.parseInt(s);

s 包含数字 1000 的 文本表示 ,即 Unicode 字符 U+0031 U+0030 U+0030 U+0030。 Integer.parseInt 采用该文本表示并将其转换为 int 类型。

但是,解析可以描述各种各样的过程,从上面的简单过程,到稍微复杂的过程,如解析十进制数或日期,再到任意复杂的对象树。

举个例子:Java 编译器将解析 Java 源代码并将其转换为内部表示,然后进行进一步处理。

根据一些定义,解析也可以应用于非文本输入,只要输入是一些符号集(可以只是字节),但这种解释相当少见。

3。连载

Serialization 是将数据或程序状态转换为易于存储或传输的东西的过程。通常这意味着进入字节流(或更直接地,byte[])。

与解析类似,序列化可以应用于非常简单的单值转换,直至序列化整个对象树并将它们写入文件。

在Java中,序列化通常是指围绕ObjectOutputStream and ObjectInputStream的机制,但该术语也用于描述一般概念(即其他格式也可以描述为“序列化”)。