我最近一直在努力学习更多,并且通常测试Java的工作和个人项目的序列化,我必须说我越了解它,我就越不喜欢它.这可能是由错误的信息造成的,所以这就是为什么我要问你们这两件事:
1:在字节级别,序列化如何知道如何将序列化值与某些类匹配?
我在这里的一个问题是我用ArrayList进行了一个小测试,其中包含值"one","two","three".在序列化之后,字节数组占用了78个字节,这对于如此少量的信息(19 + 3 + 3 + 4字节)来说似乎非常多.当然,这肯定会有一些开销,但这导致了我的第二个问题:
2:序列化可以被认为是持久化对象的好方法吗?现在很明显,如果我使用一些自制的XML格式,持久性数据将是这样的
与XML一般来说,它有点膨胀,占用138个字节(没有空格,即).JSON中也是如此
{
"java.util.ArrayList": {
"elementData": [
"one",
"two",
"three"
]
}
}
这是75字节所以已经比Java的序列化略小.使用这些基于文本的格式,显然必须有一种方法可以将基本数据表示为文本,数字或两者的任意组合.
那么回顾一下,序列化如何在字节/位级别上工作,何时应该使用以及何时不应该使用序列化以及序列化的真正好处除了它是Java的标准之外?
我个人试图避免Java的"内置"序列化:
它无法移植到其他平台
它效率不高
它很脆弱 - 让它来应对一个类的多个版本有点棘手.即使更改编译器也可能会破坏序列化,除非您小心.
有关实际字节含义的详细信息,请参阅Java对象序列化规范.
有各种替代方案,例如:
XML和JSON,如您所示(当然,各种XML风格)
YAML
Facebook的节俭(RPC以及序列化)
Google协议缓冲区
Hessian(Web服务以及序列化)
Apache Avro
你自己的自定义格式
(免责声明:我在谷歌工作,而且我正在将C#的端口作为我的20%项目的协议缓冲区,所以显然我认为这是一项很好的技术:)
由于显而易见的原因,跨平台格式几乎总是比平台特定格式更具限制性 - 例如,协议缓冲区具有非常有限的本机类型集 - 但互操作性可能非常有用.您还需要考虑版本控制的影响,具有向后和向前兼容性等.文本格式通常是可手动编辑的,但在空间和时间方面往往效率较低.
基本上,您需要仔细查看您的要求.
序列化的主要优点是它非常易于使用,速度相对较快,并且保留了实际的Java对象网格.
但是你必须意识到它并不是真的意味着用于存储数据,而主要是作为一种方式让不同的JVM实例使用RMI协议通过网络进行通信.
有关用于序列化对象的语法的文件格式的说明,请参阅Java对象序列化流协议.
就个人而言,我认为内置序列化可以保存短期数据(例如,将会话对象的状态存储到http请求之间),这在您的应用程序之外是不相关的.
对于具有更长实时时间或应在应用程序之外使用的数据,我会坚持使用数据库或至少使用更常用的格式...