java对象序列化为String

问题描述 投票:0回答:1

序列化的定义

Serialization is a mechanism of converting the state of an object into a byte stream.

将java对象转换为字符串仍然称为序列化?

 String json = objectMapper.writeValueAsString(request);

在上面的代码中,我们通常将该过程称为序列化,即使最终响应是字符串。

有人能让我理解序列化到底是什么吗?

java string object serialization jackson
1个回答
0
投票

字符串可以轻松转换为字节流 - 只需选择一种编码即可:

byte[] data = "Hello, World!".getBytes(StandardCharsets.UTF_8);

会将字符串转换为字节。或者,如果您有一系列字符串,您需要写入输出流,就像简单一样:

OutputStream out = ....; // some place you need to send bytes, but you have strings.
OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
writer.write("Hello!");
writer.write("World!");

事实上,大多数语言模糊了区别,将

byte[]
String
视为相同的数据类型,或者当其中一种更合适时允许其中一种。例如,Python 和 javascript 就是这样做的。 Java 本身没有,但很多基于字节的地方都有接受字符串的重写方法,甚至允许您不指定字符集编码。在这种情况下(将字符串转换为字节或反之亦然always涉及字符集编码)java会选择一些默认值。我建议你永远不要使用这些方法,如果你显式包含字符集,会更容易理解发生的情况,就像这个答案中的所有示例都在做的那样(它们都使用 UTF_8)。

换句话说,虽然这种过于简单化会导致大量问题,但很多程序员听到“字符串”并想到“字节”,反之亦然,并认为两者是可以互换的。将两者混为一谈是一个愚蠢的想法,但它很常见,我一点也不惊讶你读过一些展示数据如何变成字符串的东西,然后得出结论:“瞧 - 序列化!”。

有一个单独且同样充分的解释:英语的歧义性。

代码非常具体。有些代码做了某件事,你可以通过运行它来确认它。它的含义是完全明确的。你有权发表意见,但这些意见被证明是完全错误的。例如,如果给定:

System.out.println("Hello!");

如果有人说这段代码:在我看来,一个简单的 print 语句不应该打印换行符,因此,我认为上面的代码没有添加换行符 - 好吧,这可能是你的观点,但它可以证明是完全错误。因为

println
显然会打印换行符。相反,这样的陈述:

“在java中,类可以包含函数”

并不是那么明确。人们可以提出一个合理的论点,证明上述陈述是错误的,因为 java 没有函数(它有方法)。但是,我们不会要求计算机编译并执行“在java中,类可以包含函数”这句话。因此,我们不能说:这是不正确的,因为当我运行这段代码时,你说会发生的事情并没有发生。

英语是用来交流思想的。 “序列化”是一个想法。一本书将序列化定义为将任意对象转换为字节数组。用一位伟大圣人的话来说,是的,嗯,你知道,这就像,呃,你的观点,伙计! - 有人说对他们来说“序列化”意味着“将任意对象转换为简单发送的形式”通过通用术语中的通道”,并且在大多数人的估计中,字符串(当然还有整数、长整型、字节和其他一些类型)符合该定义。

因此,第一个语句的作者将“序列化”定义为字节数组,第二个语句使用该词的稍微不同的定义,并考虑包含字符串。序列化并不是地球上每个人普遍接受的规范,甚至将其限制在编程世界中。即使您仅限于 java 领域,它也不是一个普遍定义良好的单词,以至于我们可以安全地声明“如果有人使用该单词,您可以安全地假设他们正在专门讨论以字节值流结束” '.

© www.soinside.com 2019 - 2024. All rights reserved.