您的位置:首页 > 教育 > 锐评 > 序列化与反序列化及不同序列化方式的性能对比

序列化与反序列化及不同序列化方式的性能对比

2024/10/6 6:02:11 来源:https://blog.csdn.net/m0_68570169/article/details/140400993  浏览:    关键词:序列化与反序列化及不同序列化方式的性能对比

在现代分布式系统中,序列化和反序列化是不可或缺的环节。它们用于将对象转换为可传输的字节流,并在接收端重建对象。本文将探讨几种常见的序列化方式,包括JSON、Java原生序列化和Protobuf,并通过实例代码进行性能对比。

序列化方式简介
  1. JSON: 简单、可读性强,但性能和体积上相对较差。
  2. Java原生序列化: Java内置,使用简单,但体积较大且性能一般。
  3. Protobuf (Protocol Buffers): Google开发的高效序列化框架,性能和体积优于JSON和Java原生序列化。
实例代码

我们将使用一个简单的类 Cat 进行序列化和反序列化测试。Cat 类包含两个属性:nameage

import java.io.*;class Cat implements Serializable {private String name;private int age;// Constructors, getters, and setterspublic Cat(String name, int age) {this.name = name;this.age = age;}// toString method@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}
JSON序列化和反序列化

我们使用 Jackson 库进行JSON序列化和反序列化。

import com.fasterxml.jackson.databind.ObjectMapper;public class JsonSerialization {private static ObjectMapper objectMapper = new ObjectMapper();public static String serialize(Cat cat) throws IOException {return objectMapper.writeValueAsString(cat);}public static Cat deserialize(String json) throws IOException {return objectMapper.readValue(json, Cat.class);}
}

Java原生序列化和反序列化

public class NativeSerialization {public static byte[] serialize(Cat cat) throws IOException {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(cat);return bos.toByteArray();}}public static Cat deserialize(byte[] data) throws IOException, ClassNotFoundException {try (ByteArrayInputStream bis = new ByteArrayInputStream(data);ObjectInputStream ois = new ObjectInputStream(bis)) {return (Cat) ois.readObject();}}
}
Protobuf序列化和反序列化

首先,定义Protobuf的 .proto 文件:

syntax = "proto3";message Cat {string name = 1;int32 age = 2;
}

生成Java类后:

import com.google.protobuf.InvalidProtocolBufferException;
import example.CatProto.Cat;public class ProtobufSerialization {public static byte[] serialize(Cat cat) {return cat.toByteArray();}public static Cat deserialize(byte[] data) throws InvalidProtocolBufferException {return Cat.parseFrom(data);}
}
性能对比

我们通过以下代码进行性能测试:

import java.io.IOException;
import java.util.Arrays;public class SerializationPerformanceTest {public static void main(String[] args) throws IOException, ClassNotFoundException {Cat cat = new Cat("Whiskers", 3);// JSONlong jsonStart = System.nanoTime();String json = JsonSerialization.serialize(cat);Cat jsonCat = JsonSerialization.deserialize(json);long jsonEnd = System.nanoTime();System.out.println("JSON time: " + (jsonEnd - jsonStart));// Nativelong nativeStart = System.nanoTime();byte[] nativeData = NativeSerialization.serialize(cat);Cat nativeCat = NativeSerialization.deserialize(nativeData);long nativeEnd = System.nanoTime();System.out.println("Native time: " + (nativeEnd - nativeStart));// Protobufexample.CatProto.Cat protoCat = example.CatProto.Cat.newBuilder().setName("Whiskers").setAge(3).build();long protoStart = System.nanoTime();byte[] protoData = ProtobufSerialization.serialize(protoCat);example.CatProto.Cat protoCatDeserialized = ProtobufSerialization.deserialize(protoData);long protoEnd = System.nanoTime();System.out.println("Protobuf time: " + (protoEnd - protoStart));}
}
结论

根据测试结果,Protobuf的序列化和反序列化性能优于JSON和Java原生序列化。虽然JSON的可读性强,但在性能和体积上,Protobuf更具优势。因此,在对性能和体积有较高要求的场景下,推荐使用Protobuf进行序列化。

通过以上实例代码和测试结果,我们可以更好地理解不同序列化方式的优缺点,并根据具体需求选择合适的序列化方式。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com