扫码关注官方订阅号
如题,结构化数据(对象)转字节数组和字符串转字节数组的原理有什么区别?
欢迎选择我的课程,让我们一起见证您的进步~~
差一个序列化操作
这个问题其实还是要看 java ObjectOutputStream 源代码。
ObjectOutputStream
我们都知道 序列化类需要 被序列化的类实现 java.io.Serializable 类
java.io.Serializable
然后使用 ObjectOutputStream 类的 writeObject 方法来将对象转换成流。
writeObject
从ObjectOutputStream源码的描述大概得知其序列化的方式。
序列化的是对象的类,类签名,和所有非瞬态和非静态字段的值同时包括对其他对象的引用(瞬态和静态字段除外)也会导致写入序列。单个对象的多个引用被使用引用共享机制编码。英文大意,翻译的不准,最好自己读原文
按理论来说 java 的所有类型的实例都是对象,原始数据类型外(Primitive data types)
writeObject 方法并不是 真正的发生写入的方法。
/** * Underlying writeObject/writeUnshared implementation. */ private void writeObject0(Object obj, boolean unshared)
writeObject0 方法才是真正实现。
writeObject0
从实现中可以看出,该方法 是通过 writeString 方法实现写入序列。
writeString
字符串作为char数组类型的封装实现在序列化的时候被特殊对待了。
再来看看 writeString 的源码
可以看到 string 被当做一种原始数据,采用类似 DataOutputStream 的处理方式写入到了序列。 String 被当成数据写出,而不是结构化对象。
DataOutputStream
说道这儿来,就不需要往下追踪了。题主大概也知道怎么回事了。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
差一个序列化操作
这个问题其实还是要看 java
ObjectOutputStream源代码。我们都知道 序列化类需要 被序列化的类实现
java.io.Serializable类然后使用
ObjectOutputStream类的writeObject方法来将对象转换成流。从
ObjectOutputStream源码的描述大概得知其序列化的方式。默认序列化机制:
按理论来说 java 的所有类型的实例都是对象,原始数据类型外(Primitive data types)
writeObject 方法并不是 真正的发生写入的方法。
writeObject0方法才是真正实现。从实现中可以看出,该方法 是通过
writeString方法实现写入序列。字符串作为char数组类型的封装实现在序列化的时候被特殊对待了。
再来看看
writeString的源码可以看到 string 被当做一种原始数据,采用类似
DataOutputStream的处理方式写入到了序列。 String 被当成数据写出,而不是结构化对象。说道这儿来,就不需要往下追踪了。题主大概也知道怎么回事了。