分布式系列三: 对象序列化

简介: 序列化可以解决分布式系统节点间复杂对象传输的问题. 将对象状态转化为可存储或可传输的过程叫序列化, 而反序列化是将其还原成对象的过程.几种序列化机制JDK的序列化Java默认的序列化要求实现Serializable接口.

序列化可以解决分布式系统节点间复杂对象传输的问题. 将对象状态转化为可存储或可传输的过程叫序列化, 而反序列化是将其还原成对象的过程.

几种序列化机制

JDK的序列化

Java默认的序列化要求实现Serializable接口.

缺点:

  1. 序列化的结果比较大, 占用字节多, 传输效率低
  2. 仅Java实现, 不能跨语言

WebService

基于XML格式的传输.

Json方式

缺点:

  1. 结果依然较大
  2. 性能低

二进制传输

MessagePack
Protocal Buffer

Java的默认方式

// 使用了lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car implements Serializable{

    // 版本号, java通过此版本号是否一致判断是否可以执行反序列化
    // 名称的数据类型必须准确,否则只是相当于定义一个普通的静态变量
    public static long serialVersionUID = -1244L;

    // 静态变量不序列化
    public static int age = 10;

    // 用protobuffer的话, 需要field上加Protobuffer的注解
    @Protobuf(fieldType = FieldType.INT32,order = 1)
    private int wheels;
    @Protobuf(fieldType = FieldType.STRING,order = 2)
    private String name;

    // 瞬时变量, 不被序列化
    private transient String desc;

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //serializeCar();
        Car car = deSerializeCar();
        System.out.println(car.age);
        System.out.println(car.toString());
    }

    private static void serializeCar() throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("car")));
        Car car = new Car(4, "BMW", "fast....");
        objectOutputStream.writeObject(car);
        car.age = 12;
        objectOutputStream.close();
    }

    private static Car deSerializeCar() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream;
        objectInputStream = new ObjectInputStream(new FileInputStream(new File("car")));
        Car car = (Car) objectInputStream.readObject();
        return car;
    }
}
  1. static final long serialVersionUID = -124L; 序列化版本号, 一致的版本才可以反序列化
  2. 静态变量不参与序列化
  3. transient 修饰的变量不序列化
  4. 父类实现序列化接口,子类会继承; 子类实现但父类不实现, 则父类的字段不被序列化(代码略)
  5. 序列化对象的存储: 同一对象的序列化,第二次将只存储第一个的引用及变化的部分,这样可以节省空间(代码略)
  6. 实现深克隆, 参看设计模式五: 原型模式(Prototype)

常用序列化协议

  • Json: Json是比较流行的序列化机制, Spring 默认的json序列化是使用Jackson, 阿里的FastJson效率更高且更易于使用.
  • Protobuffer: 二进制序列化有性能和传输方面的优势. 还有MessagePackage
  • Hessian2, Dobbo使用此协议
  • XML
  • FST
// FastJson的序列化和反序列化
String strJson = JSON.toJSONString(object);
Object object = JSON.parse(text);

//Hessian的序列化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream);
hessian2Output.writeObject(object);

//Protobuffer的序列化
Codec<Car> carCodec = ProtobufProxy.create(Car.class, false);
byte[] bytes = carCodec.encode(object);

序列化需要引用相关的包, 下面列出几个.

<!--jackson的序列化包-->
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

<!--fastjson的序列化包-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.49</version>
</dependency>

<!--Protobuffer的序列化包,由百度封装,增加了易用性-->
<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>jprotobuf</artifactId>
    <version>2.2.5</version>
</dependency>

<!--hessian的序列化包-->
<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.51</version>
</dependency>
相关文章
|
2月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
2月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
44 2
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
35 0
|
3月前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!
|
3月前
|
存储 Java
Java编程中的对象序列化与反序列化
【9月更文挑战第12天】在Java的世界里,对象序列化与反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何通过实现Serializable接口来标记一个类的对象可以被序列化,并探索ObjectOutputStream和ObjectInputStream类的使用,以实现对象的写入和读取。我们还将讨论序列化过程中可能遇到的问题及其解决方案,确保你能够高效、安全地处理对象序列化。
|
3月前
|
XML Dubbo Java
分布式-序列化,反序列化
分布式-序列化,反序列化