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;
在 运行 之后,此代码 a
和 b
将指向完全相同的对象(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;
此处 int
值 1000
被转换为 char
和 byte
。第一个演员让 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
的机制,但该术语也用于描述一般概念(即其他格式也可以描述为“序列化”)。
这 3 个术语处理从一种形式到另一种形式的转换,这看起来相似且令人困惑。一般来说,哪些独特的特征使它们与众不同?在什么情况下应该分别使用什么?
它们的相似之处在于所有 3 个都处理将数据从一种表示形式转换为另一种表示形式(几乎,转换引用类型有点特殊)。
1。选角
在 Java 中,转换会做两件不同的事情,具体取决于您是转换引用还是原始值:
转换引用只是改变了引用的类型,它不会改变对象的任何内容。例如:
Object a = "a string constant"; String b = (String) a;
在 运行 之后,此代码
a
和b
将指向完全相同的对象(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;
此处
int
值1000
被转换为char
和byte
。第一个演员让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
的机制,但该术语也用于描述一般概念(即其他格式也可以描述为“序列化”)。