Skip to content

Commit 879a101

Browse files
committed
feat: proto buf
1 parent babb6fe commit 879a101

10 files changed

Lines changed: 430 additions & 1 deletion

File tree

pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
<modules>
1111
<module>core-java-modules</module>
1212
<module>core-java-rate-limiter</module>
13-
<module>junit5-jupiter-starter</module>
13+
<module>tool-java-junit5-jupiter-starter</module>
1414
<module>leetcode</module>
1515
<module>tool-java-apache-httpclient</module>
1616
<module>tool-java-object-pool</module>
1717
<module>tool-java-jackson</module>
1818
<module>tool-java-apache-common</module>
1919
<module>tool-java-hotcode</module>
20+
<module>tool-java-protobuf</module>
2021
</modules>
2122
<name>parent-modules</name>
2223
<description>Parent for all java modules</description>

tool-java-protobuf/pom.xml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>com.wdbyte</groupId>
8+
<artifactId>parent-modules</artifactId>
9+
<version>1.0.0-SNAPSHOT</version>
10+
</parent>
11+
12+
<artifactId>tool-java-protobuf</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>1.8</maven.compiler.source>
16+
<maven.compiler.target>1.8</maven.compiler.target>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
20+
<dependencies>
21+
<dependency>
22+
<groupId>com.google.protobuf</groupId>
23+
<artifactId>protobuf-java</artifactId>
24+
<version>3.22.3</version>
25+
</dependency>
26+
27+
<dependency>
28+
<groupId>com.alibaba</groupId>
29+
<artifactId>fastjson</artifactId>
30+
<version>2.0.7</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.openjdk.jmh</groupId>
34+
<artifactId>jmh-core</artifactId>
35+
<version>1.33</version>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.openjdk.jmh</groupId>
39+
<artifactId>jmh-generator-annprocess</artifactId>
40+
<version>1.33</version>
41+
<scope>provided</scope>
42+
</dependency>
43+
44+
</dependencies>
45+
</project>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.wdbyte.tool.protos;
2+
3+
import java.util.List;
4+
5+
public class AddressBookJava {
6+
List<PersonJava> personJavaList;
7+
8+
public static class PersonJava {
9+
private int id;
10+
private String name;
11+
private String email;
12+
private PhoneNumberJava phones;
13+
14+
public int getId() {
15+
return id;
16+
}
17+
18+
public void setId(int id) {
19+
this.id = id;
20+
}
21+
22+
public String getName() {
23+
return name;
24+
}
25+
26+
public void setName(String name) {
27+
this.name = name;
28+
}
29+
30+
public String getEmail() {
31+
return email;
32+
}
33+
34+
public void setEmail(String email) {
35+
this.email = email;
36+
}
37+
38+
public PhoneNumberJava getPhones() {
39+
return phones;
40+
}
41+
42+
public void setPhones(PhoneNumberJava phones) {
43+
this.phones = phones;
44+
}
45+
}
46+
47+
public static class PhoneNumberJava {
48+
private String number;
49+
private PhoneTypeJava phoneTypeJava;
50+
51+
public String getNumber() {
52+
return number;
53+
}
54+
55+
public void setNumber(String number) {
56+
this.number = number;
57+
}
58+
59+
public PhoneTypeJava getPhoneTypeJava() {
60+
return phoneTypeJava;
61+
}
62+
63+
public void setPhoneTypeJava(PhoneTypeJava phoneTypeJava) {
64+
this.phoneTypeJava = phoneTypeJava;
65+
}
66+
}
67+
68+
public enum PhoneTypeJava {
69+
MOBILE,
70+
HOME,
71+
WORK;
72+
}
73+
74+
public List<PersonJava> getPersonJavaList() {
75+
return personJavaList;
76+
}
77+
78+
public void setPersonJavaList(List<PersonJava> personJavaList) {
79+
this.personJavaList = personJavaList;
80+
}
81+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.wdbyte.tool.protos;
2+
3+
import com.google.protobuf.InvalidProtocolBufferException;
4+
import com.wdbyte.tool.protos.Person.PhoneNumber;
5+
import com.wdbyte.tool.protos.Person.PhoneType;
6+
7+
8+
/**
9+
* @author https://www.wdbyte.com
10+
* @date 2023/05/07
11+
*/
12+
public class ProtobufTest1 {
13+
14+
public static void main(String[] args) {
15+
// 直接构建
16+
PhoneNumber phoneNumber1 = PhoneNumber.newBuilder().setNumber("18388888888").setType(PhoneType.HOME).build();
17+
Person person1 = Person.newBuilder().setId(1).setName("www.wdbyte.com").setEmail("[email protected]").addPhones(phoneNumber1).build();
18+
AddressBook addressBook1 = AddressBook.newBuilder().addPeople(person1).build();
19+
System.out.println(addressBook1);
20+
System.out.println("------------------");
21+
22+
// 链式构建
23+
AddressBook addressBook2 = AddressBook
24+
.newBuilder()
25+
.addPeople(Person.newBuilder()
26+
.setId(2)
27+
.setName("www.wdbyte.com")
28+
.setEmail("[email protected]")
29+
.addPhones(PhoneNumber.newBuilder()
30+
.setNumber("18388888888")
31+
.setType(PhoneType.HOME)
32+
)
33+
)
34+
.build();
35+
System.out.println(addressBook2);
36+
}
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.wdbyte.tool.protos;
2+
3+
import java.io.FileInputStream;
4+
import java.io.FileOutputStream;
5+
import java.io.IOException;
6+
7+
import com.wdbyte.tool.protos.Person.PhoneNumber;
8+
import com.wdbyte.tool.protos.Person.PhoneType;
9+
10+
/**
11+
*
12+
* @author https://www.wdbyte.com
13+
*/
14+
public class ProtobufTest2 {
15+
16+
public static void main(String[] args) throws IOException {
17+
PhoneNumber phoneNumber1 = PhoneNumber.newBuilder().setNumber("18388888888").setType(PhoneType.HOME).build();
18+
Person person1 = Person.newBuilder().setId(1).setName("www.wdbyte.com").setEmail("[email protected]").addPhones(phoneNumber1).build();
19+
AddressBook addressBook1 = AddressBook.newBuilder().addPeople(person1).build();
20+
21+
// 序列化成字节数组
22+
byte[] byteArray = addressBook1.toByteArray();
23+
// 反序列化 - 字节数组转对象
24+
AddressBook addressBook2 = AddressBook.parseFrom(byteArray);
25+
System.out.println("字节数组反序列化:");
26+
System.out.println(addressBook2);
27+
28+
// 序列化到文件
29+
addressBook1.writeTo(new FileOutputStream("AddressBook1.txt"));
30+
// 读取文件反序列化
31+
AddressBook addressBook3 = AddressBook.parseFrom(new FileInputStream("AddressBook1.txt"));
32+
System.out.println("文件读取反序列化:");
33+
System.out.println(addressBook3);
34+
}
35+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.wdbyte.tool.protos;
2+
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
6+
import com.alibaba.fastjson.JSON;
7+
8+
import com.wdbyte.tool.protos.AddressBook.Builder;
9+
import com.wdbyte.tool.protos.AddressBookJava.PersonJava;
10+
import com.wdbyte.tool.protos.AddressBookJava.PhoneNumberJava;
11+
import com.wdbyte.tool.protos.AddressBookJava.PhoneTypeJava;
12+
import com.wdbyte.tool.protos.Person.PhoneNumber;
13+
import com.wdbyte.tool.protos.Person.PhoneType;
14+
15+
/**
16+
* @author https://www.wdbyte.com
17+
*/
18+
public class ProtobufTest3 {
19+
20+
public static void main(String[] args) throws IOException {
21+
AddressBookJava addressBookJava = createAddressBookJava(1000);
22+
String jsonString = JSON.toJSONString(addressBookJava);
23+
System.out.println("json string size:" + jsonString.length());
24+
25+
AddressBook addressBook = createAddressBook(1000);
26+
byte[] addressBookByteArray = addressBook.toByteArray();
27+
System.out.println("protobuf byte array size:" + addressBookByteArray.length);
28+
}
29+
30+
public static AddressBook createAddressBook(int personCount) {
31+
Builder builder = AddressBook.newBuilder();
32+
for (int i = 0; i < personCount; i++) {
33+
builder.addPeople(Person.newBuilder()
34+
.setId(i)
35+
.setName("www.wdbyte.com")
36+
.setEmail("[email protected]")
37+
.addPhones(PhoneNumber.newBuilder()
38+
.setNumber("18333333333")
39+
.setType(PhoneType.HOME)
40+
)
41+
);
42+
}
43+
return builder.build();
44+
}
45+
46+
public static AddressBookJava createAddressBookJava(int personCount) {
47+
AddressBookJava addressBookJava = new AddressBookJava();
48+
addressBookJava.setPersonJavaList(new ArrayList<>());
49+
for (int i = 0; i < personCount; i++) {
50+
PersonJava personJava = new PersonJava();
51+
personJava.setId(i);
52+
personJava.setName("www.wdbyte.com");
53+
personJava.setEmail("[email protected]");
54+
55+
PhoneNumberJava numberJava = new PhoneNumberJava();
56+
numberJava.setNumber("18333333333");
57+
numberJava.setPhoneTypeJava(PhoneTypeJava.HOME);
58+
59+
personJava.setPhones(numberJava);
60+
addressBookJava.getPersonJavaList().add(personJava);
61+
}
62+
return addressBookJava;
63+
}
64+
}
65+
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.wdbyte.tool.protos;
2+
3+
import java.util.ArrayList;
4+
import java.util.concurrent.TimeUnit;
5+
6+
import com.alibaba.fastjson.JSON;
7+
8+
import com.google.protobuf.InvalidProtocolBufferException;
9+
import com.wdbyte.tool.protos.AddressBook.Builder;
10+
import com.wdbyte.tool.protos.AddressBookJava.PersonJava;
11+
import com.wdbyte.tool.protos.AddressBookJava.PhoneNumberJava;
12+
import com.wdbyte.tool.protos.AddressBookJava.PhoneTypeJava;
13+
import com.wdbyte.tool.protos.Person.PhoneNumber;
14+
import com.wdbyte.tool.protos.Person.PhoneType;
15+
import org.openjdk.jmh.annotations.Benchmark;
16+
import org.openjdk.jmh.annotations.BenchmarkMode;
17+
import org.openjdk.jmh.annotations.Fork;
18+
import org.openjdk.jmh.annotations.Measurement;
19+
import org.openjdk.jmh.annotations.Mode;
20+
import org.openjdk.jmh.annotations.OutputTimeUnit;
21+
import org.openjdk.jmh.annotations.Scope;
22+
import org.openjdk.jmh.annotations.Setup;
23+
import org.openjdk.jmh.annotations.State;
24+
import org.openjdk.jmh.annotations.Warmup;
25+
26+
/**
27+
* @author https://www.wdbyte.com
28+
*/
29+
@State(Scope.Thread)
30+
@Fork(2)
31+
@Warmup(iterations = 3, time = 3)
32+
@Measurement(iterations = 5, time = 3)
33+
@BenchmarkMode(Mode.Throughput)
34+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
35+
public class ProtobufTest4 {
36+
37+
private AddressBookJava addressBookJava;
38+
private AddressBook addressBook;
39+
40+
@Setup
41+
public void init() {
42+
addressBookJava = createAddressBookJava(1000);
43+
addressBook = createAddressBook(1000);
44+
}
45+
46+
@Benchmark
47+
public AddressBookJava testJSON() {
48+
// 转 JSON
49+
String jsonString = JSON.toJSONString(addressBookJava);
50+
// JSON 转对象
51+
return JSON.parseObject(jsonString, AddressBookJava.class);
52+
}
53+
54+
@Benchmark
55+
public AddressBook testProtobuf() throws InvalidProtocolBufferException {
56+
// 转 JSON
57+
byte[] addressBookByteArray = addressBook.toByteArray();
58+
// JSON 转对象
59+
return AddressBook.parseFrom(addressBookByteArray);
60+
}
61+
62+
public static AddressBook createAddressBook(int personCount) {
63+
Builder builder = AddressBook.newBuilder();
64+
for (int i = 0; i < personCount; i++) {
65+
builder.addPeople(Person.newBuilder()
66+
.setId(i)
67+
.setName("www.wdbyte.com")
68+
.setEmail("[email protected]")
69+
.addPhones(PhoneNumber.newBuilder()
70+
.setNumber("18333333333")
71+
.setType(PhoneType.HOME)
72+
)
73+
);
74+
}
75+
return builder.build();
76+
}
77+
78+
public static AddressBookJava createAddressBookJava(int personCount) {
79+
AddressBookJava addressBookJava = new AddressBookJava();
80+
addressBookJava.setPersonJavaList(new ArrayList<>());
81+
for (int i = 0; i < personCount; i++) {
82+
PersonJava personJava = new PersonJava();
83+
personJava.setId(i);
84+
personJava.setName("www.wdbyte.com");
85+
personJava.setEmail("[email protected]");
86+
87+
PhoneNumberJava numberJava = new PhoneNumberJava();
88+
numberJava.setNumber("18333333333");
89+
numberJava.setPhoneTypeJava(PhoneTypeJava.HOME);
90+
91+
personJava.setPhones(numberJava);
92+
addressBookJava.getPersonJavaList().add(personJava);
93+
}
94+
return addressBookJava;
95+
}
96+
}
97+

0 commit comments

Comments
 (0)