赞
踩
由于 Java 对象存放在 JVM 的堆内存当中,所以当这个对象需要拿来做数据传输(比如前后端传递、进程/模块间传递)时,就需要将 Java对象 -> 转变为二进制串,这个就是序列化的过程。而另外一边的数据接收后需要将二进制串 -> Java对象,这个就是反序列化的过程。以下实践了采用原生IO进行了对象的序列化与反序列化,后续再尝试采用其它工具包实现一下序列化器。
- public class JdkSerializer {
-
- /**
- * 序列化
- *
- * @param object 对象
- * @return byte[]
- * @throws IOException IO 异常
- */
- public byte[] serialize(Object object) throws IOException {
- // 1、创建存储序列化后的字节数组的输出流
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- // 2、创建存储序列化后的字节数组的输出流
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
- // 3、将对象序列化到输出流 并及时关闭资源
- objectOutputStream.writeObject(object);
- objectOutputStream.close();
- // 4、返回序列化后的字节数组
- return outputStream.toByteArray();
- }
-
- /**
- * 反序列化
- *
- * @param data byte[]
- * @return {@link Object}
- * @throws IOException IO 异常
- */
- public Object deserialize(byte[] data) throws IOException {
- // 1、创建存储反序列化后的字节数组的输入流
- ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
- // 2、创建存储反序列化后的字节数组的输入流
- try (ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) {
- return objectInputStream.readObject();
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
- }
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public class User implements Serializable {
-
- /** 正反序列化而使用的 */
- private static final long serialVersionUID = 386L;
-
- /**
- * 姓名
- */
- private String name;
-
- /**
- * 年龄
- */
- private Integer age;
- }
- public class SerializerTest {
- public static void main(String[] args) {
- try {
- byte[] serialize = jdkSerializer.serialize(new User("张三", 18));
- // 序列化后的值: [B@5e265ba4
- System.out.println("序列化后的值: " + serialize);
- // 反序列化后的值: User(name=张三, age=18)
- System.out.println("反序列化后的值: " + jdkSerializer.deserialize(serialize));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。