序列化的目的是将对象持久化到硬盘或者用于网络传输。java也提供了序列化技术,非常简单,只要实现Serializable接口即可。如下:
public class commonService implements Serializable {
private static final long serialVersionUID = 1L;
}
这种方式有以下几个缺点:(1)无法跨语言 (2)序列化的码流太大 (3)序列化的性能差
下面我测试一下序列化一个对象后的大小,代码如下:
public class TestBuf implements Serializable {
private int id;
private String url;
private ArrayList<String> name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public ArrayList<String> getName() {
return name;
}
public void setName(ArrayList<String> name) {
this.name = name;
}
}
public static void main(String[]args)throws IOException{
TestBuf testBuf1 = new TestBuf();
testBuf1.setId(1);
testBuf1.setUrl("www.baidu.com");
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
testBuf1.setName(list);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream1 = new ObjectOutputStream(outputStream);
outputStream1.writeObject(testBuf1);
System.out.println("Serializable====="+outputStream.toByteArray().length);
}
运行结果如下:
接下来我们使用google protobuf,序列化同一个对象,看看序列化后的对象大小。
(1)首先下载 protoc.exe和protobuf-java-2.5.0.jar ,地址http://download.csdn.net/detail/yangheng362/8516923
(2)编写proto文件,这里命名为test.proto,代码如下:
package protobuf;
option java_package = "com.test.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf {
required int32 ID = 1;
optional string Url = 2;
repeated string name=3;
}
option java_package = "com.test.protobuf"; 就是生成的路径。
option java_outer_classname = "FirstProtobuf"; 就是生成的类名称。
required\optional\repeated就是一些修饰符,分别是必填,可选以及集合。
(3)将文件放在解压的protoc.exe同级目录下,启动cmd控制台,执行代码如下:
protoc ./test.proto --java_out=./
(4)把生成的文件FirstProtobuf.java拷到新建的java目录下, 引入jar包 protobuf-java-2.5.0.jar
(5)测试序列化以及反序列化,代码如下:
public class TestProtobuf {
public static void main(String[]args)throws IOException{
FirstProtobuf.testBuf.Builder builder = FirstProtobuf.testBuf.newBuilder();
builder.setID(1);
builder.setUrl("www.baidu.com");
builder.addName("aaa");
builder.addName("bbb");
builder.addName("ccc");
FirstProtobuf.testBuf info = builder.build();
byte[] result = info.toByteArray();
System.out.println("google protobuf====="+result.length);
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);
System.out.println(testBuf);
}
}
显示结果如下:同样的对象,使用java自带的序列化的大小为201字节,而google的protobuf只有32个字节。
参考地址:http://www.tuicool.com/articles/EJrQRr3