首页 > 解决方案 > Java 中的强制转换、解析和序列化:有什么区别?

问题描述

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

标签: javaparsingserializationcasting

解决方案


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

1. 铸造

在 Java 中,转换做了两件不同的事情,这取决于你是在转换引用还是原始值:

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

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

    运行此代码后,ab都将指向完全相同的对象(String表示值的类型"a string constant")。a区别只是Object类型引用和b类型String引用。这限制了您可以调用的内容(因此a.length()不起作用,但b.length()会起作用)。

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

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

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

    此处的int1000同时转换为 tochar和 to byte。第一个演员只是离开c等于1000。但byte不能保持值1000,所以会被截断为-24

2.解析

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

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.序列化

序列化是将数据或程序状态转换为可以轻松存储或传输的东西的过程。通常这意味着进入一个字节流(或更直接地,a byte[])。

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

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


推荐阅读