1、定义一个 .proto后缀名的文件
test.proto如下:
-------------------------------------------------------------------------------------------------------------
package entity;
option java_package = "com.entity";
option java_outer_classname = "SchoolProtos";
message Classes {
optional string name = 1;
optional int32 id = 2;
message Students {
optional string name = 1;
optional string age = 2;
}
repeated Students stu = 3;
}
message School {
repeated Classes cls = 1;
}
-------------------------------------------------------------------------------------------------------------
2、cmd命令:
要下载 protoc.exe,官网地址: http://code.google.com/p/protobuf/downloads/list
下载protoc-2.4.1-win32.zip
F:>cd students\Goolprotobuf>protoc.exe --java_out=./ test.proto
在目录下回生成文件SchoolProtos.java
3、测试序列化
SchoolProtos.School.Builder builder = SchoolProtos.School.newBuilder();
Students.Builder stu1 = Students.newBuilder();
stu1.setName("张三");
stu1.setAge("23");
Students.Builder stu2 = Students.newBuilder();
stu2.setName("李四");
stu2.setAge("24");
Classes.Builder clas = Classes.newBuilder();
clas.setName("软件1201");
clas.setId(1201);
clas.addStu(stu1);
clas.addStu(stu2);
Students.Builder stu3 = Students.newBuilder();
stu3.setName("王五");
stu3.setAge("27");
Students.Builder stu4 = Students.newBuilder();
stu4.setName("赵六");
stu4.setAge("28");
Classes.Builder clas1 = Classes.newBuilder();
clas1.setName("软件1202");
clas1.setId(1202);
clas1.addStu(stu3);
clas1.addStu(stu4);
builder.addCls(clas);
builder.addCls(clas1);
byte[] result = null;
//序列化
long time1 = System.nanoTime();
SchoolProtos.School bean = builder.build();
bean.toByteArray();
long time2 = System.nanoTime();
System.out.println((time2 - time1) + " ");
result = bean.toByteArray();
//反序列化
try {
long time3 = System.nanoTime();
SchoolProtos.School school = SchoolProtos.School.parseFrom(result);
long time4 = System.nanoTime();
System.out.println((time4 - time3) + " ");
} catch (InvalidProtocolBufferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
--说明:
为了避免命名冲突,.proto文件以包声明开始,在java中除了特别指定一个java_package属性,否则包名一般为Java的包。正像上面的例子,虽然提供了java_package属性,你通常还是应该定义package属性以避免在ProtocolBuffers中命名冲突。包声明以后,有两个Java属性:java_package和java_outer_classname。java_package表示生成的Java代码的包,如果没有指定,编译器会根据package属性确定包名。java_outer_classname属性定义生成文件的类名。如果没有指定,会根据文件名进行转换,如:"my_proto.proto"缺省会使用MyProto作为外部类名。
接下来是定义message属性,一个message是包含了各种类型字段的聚集。有很多标准的变量类型可以使用,包括:bool,int32,float,double和string。你也可以使用其他的message作为字段类型。正像例子中的Person包含了 PhoneNumber,而AddressBook包含了Persion。甚至可以在message内部定义message,例如:PhoneNumber就是在Persion里面定义的。你还可以定义enum类型,正像指定电话号码类型的MOBILE、HOME、WORK。
其中“=1”,“=2”表示每个元素的标识号,它会用在二进制编码中对域的标识。标识号1-15由于使用时会比那些高的标识号少一个字节,从最优化角度考虑,可以将其使用在一些较常用的或repeated元素上,对于16以上的则使用在不常用的或optional的元素上。对于repeated的每个元素都需要重复编码该标识号,所以repeated的域进行优化来说是最显示的。
每个字段必须提供一个修饰词:
Ø required:表示字段必须提供,不能为空。否则message会被认为是未初始化的,试图build未初始化的message会抛出 RuntimeException。解析未初始化的message会抛出IOException。除此之外,一个required字段与optional 字段完全相同。
Ø optional:可选字段,可以设置也可以不设置。如果没有设置,会设置一个缺省值。可以指定一个缺省值,正像电话号码的type字段。否则,使用系统的缺省值:数字类型缺省为0;字符类型缺省为空串;逻辑类型缺省为false;对于嵌入的message,缺省值通常是message的实例或原型。
Ø repeated:字段可以被重复(包括0),可等同于动态数组或列表。其中存储的值列表的顺序是被保留的。
Required修饰的字段是永久性的,在使用该修饰符时一定要特别小心。如果在以后想要修改required域为optional域时会出现问题。对于访问旧接口的用户来说没有该字段时,将会认为是不合法的访问,将会被拒绝或丢弃。其中google的一些工程师给出的建议是如果不是必须,就尽量少用required修饰符。
内容摘要:http://www.open-open.com/home/space-37924-do-blog-id-5874.html
分享到:
相关推荐
在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入安全风险,因为不安全的反序列化可能导致远程代码执行(RCE)漏洞。 在给定的标题和描述中,提到了几个...
java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...
Java序列化还支持版本控制,即`serialVersionUID`。这个版本号用于验证序列化过程中类的兼容性。如果类在序列化后进行了修改,`serialVersionUID`应该相应更新,否则反序列化可能会失败。如果没有显式定义,Java会...
此外,C#还提供了JSON序列化库如Newtonsoft.Json(Json.NET),它在Web应用中广泛应用,支持更灵活的JSON格式转换。 Java中,除了基本的序列化机制,还有许多第三方库如Jackson、Gson等,它们提供了更高效、更灵活...
下面我们将深入探讨Java序列化的概念、作用、实现方式以及相关应用。 1. **序列化概念** - Java序列化是Java平台提供的一种持久化机制,它允许将对象转换为字节序列,这样就可以保存在文件中或在网络上传输。 - ...
在Java编程语言中,序列化和反序列化是两种重要的技术,它们允许我们将对象的状态转换为字节流,以便存储到磁盘上或通过网络进行传输。这些技术在处理持久化数据、对象缓存以及跨进程通信(如RMI - 远程方法调用)时...
Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...
Java中的序列化与反序列化是Java编程语言中用于处理对象状态持久化和网络传输的重要技术。序列化是指将一个Java对象转换为字节流的过程,这样...理解和熟练掌握序列化机制,对于编写高效、安全的Java应用程序至关重要。
Java的序列化与反序列化是Java开发中的一项重要...在实际应用中,要根据具体需求来选择合适的序列化库,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro等,它们提供了更高效、更灵活的序列化解决方案。
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
Protocol Buffer(简称PB)是Google开发的一种高效的数据序列化协议,而Java序列化是Java平台内置的一种序列化机制。两者的主要目标都是将对象转化为字节数组,便于在网络传输、持久化存储等场景中使用。然而,它们...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的...以上内容涵盖了Java序列化标准的关键知识点,深入了解这些概念有助于更好地理解和应用Java序列化技术。
同样,JBoss应用服务器也曾经遭受过类似的安全威胁,比如CVE-2017-12149,该漏洞允许远程攻击者通过反序列化操作执行服务器上的任意代码。 这些反序列化工具可能包含以下功能: 1. **Payload生成器**:创建特定格式...
3. **序列化操作**:使用`FSTObjectOutput`进行序列化,`FSTObjectInput`进行反序列化,这两个类提供了类似于`ObjectOutputStream`和`ObjectInputStream`的API。 4. **优化配置**:根据具体需求,可以通过配置项...
Java序列化和反序列化是将对象的状态转换为字节流和从字节流恢复对象状态的过程,这对于数据持久化、网络传输以及跨进程通信等场景至关重要。在Java中,`java.io.Serializable`接口用于标记一个类是可序列化的。然而...
Java中的JSON(JavaScript Object Notation)序列化与反序列化是开发过程中常见且重要的操作,主要用于数据交换和存储。JSON是一种轻量级的数据交换格式,它允许我们将Java对象转换为JSON字符串,反之亦然,方便在...
Java对象的序列化和反序列化是Java编程中的一项重要技术,主要应用于数据持久化、网络传输等场景。本课件详细介绍了这一概念及其在实际应用中的操作。 首先,序列化是将Java对象转化为字节序列的过程,目的是为了...
极好的序列化与发序列化代码。可以处理array集合,数组或者单个对象等的序列化与反序列化。
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
Java序列化是Java平台中的一种标准机制,允许对象的状态被保存到磁盘或者在网络中进行传输,以便在后续的时间或地点恢复这些对象。这个过程包括两个主要操作:序列化(将对象转换为字节流)和反序列化(将字节流恢复...