| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
English | 简体中文
// The zfoo protocol is registered and can only be initialized once ProtocolManager.initProtocol(Set.of(ComplexObject.class, ObjectA.class, ObjectB.class)); // serialization ProtocolManager.write(byteBuf, complexObject); // deserialization var packet = ProtocolManager.read(buffer);
Test the environment
system:win10 cpu: i9900k memory:64g

The data compression volume is small, and the compression volume is smaller than that of Kryo and Protobuf; Smaller than kryo because kryo needs to write the registration number of each object Intelligent syntax, incorrect protocol definitions will fail to start the program and give an error warning Improve development efficiency, fully support POJO development, very easy to use
The current size of the serialized object is as follows: Simple objects, zfoo package size 8, kryo package size 5, protobuf package size 8 Regular objects, ZFOO package size 430, KRYO package size 483, Protobuf package size 793 For complex objects, ZFOO package size 2216, KRYO package size 2528, and Protobuf package size 5091
Default data format support eliminates the need for users to register manually.Reference class definition
Unsupported data formats, because ZFOO automatically recognizes unsupported types and gives error warnings, so users don't have to care too much
The protocol class must be a simple javabean, not inheriting from any other class, but can inherit an interface
The protocol number is defined as a short type to reduce the packet size and memory size, a packet can be reduced by 2 bytes, and the application memory of each protocol can also be reduced by 6 byte(protocols + IProtocolRegistration + protocolIdMap)
It is difficult for a project's protocol body class to exceed 3 w, and there will be tools that automatically package your protocol number a little more compactly, so that your protocol number will not exceed 3 w
There are four ways to indicate that the protocol class
The first uses annotations: @Protocol(id = protocolId)
@Protocol(id = 104)
public class SimpleObject {
public int c;
public boolean g;
}
The second use: Register the agreement through Protocol Manager.initProtocolAuto() without writing the protocol number
public class SimpleObject {
public int c;
public boolean g;
}
The third use: Register the protocol through ProtocolManager.initProtocol(xmlProtocols) in the protocol.xml file
<protocols>
<!-- Use class path -->
<module id="1" name="common">
<protocol id="100" location="com.zfoo.protocol.packet.ComplexObject"/>
<protocol id="101" location="com.zfoo.protocol.packet.NormalObject"/>
<protocol id="102" location="com.zfoo.protocol.packet.ObjectA"/>
<protocol id="103" location="com.zfoo.protocol.packet.ObjectB"/>
<protocol id="104" location="com.zfoo.protocol.packet.SimpleObject"/>
<protocol id="105" location="com.zfoo.protocol.packet.VeryBigObject"/>
<protocol id="106" location="com.zfoo.protocol.packet.EmptyObject"/>
</module>
<!-- Use a package name scans all protocol classes under the package path -->
<module id="2" name="native">
<protocol location="com.zfoo.net.packet.common"/>
<protocol location="com.zfoo.tank.common.protocol.common"/>
</module>
</protocols>
The fourth use: generate a protocol with a protocol number by defining a proto file, so that the protocol can be easily registered
syntax = "proto3";
package test.message;
message SimpleObject {
int64 aa = 1;
}
// If the tag of a field exceeds 1000, the field is considered to be a compatible protocol field
message OneMessage {
// This is a comment on the field
int64 id = 1;
// This is equivalent to adding a @Compatible annotation to this field
string name = 1001;
}
If you add a field for version compatibility, you need to add a Compatible annotation, and the order needs to be naturally increased, so as to ensure that the old and new protocols can be compatible with each other, Protocol nesting is also still compatible
In order to be compatible with versions and avoid modifying field names, default uses field names to read and write in the natural order of strings (can also be customized), so it will cause exceptions in serialization
The official environment does not necessarily have to delete an unwanted field in order to be version compatible and avoid reducing fields
Among the six principles of design patterns, the principle of opening and closing is open to expansion and closed to modification. The design of the protocol should also adhere to this principle when it comes to functionality, prioritizing the addition of new protocols over modifying existing ones
In fact, the officially launched project almost did not encounter anyone who would delete the field, and if this field was deleted, the server had to change the code not to reference the deleted field, and the client had to change the code not to reference the deleted field, which doubled the workload. If either of them forgets to modify the code, it will directly report an error, so adding a discarded field @Deprecated comment to this field in the actual project can avoid a lot of unnecessary trouble.
zfoo takes the intersection of type declarations in all languages, instead of protobuf taking the union, simplifying the type implementation of protobuf
double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes bytes
float double byte int16 int32 int64 bool string
zfoo takes the intersection of the grammars of all languages, instead of the union of protobuf, and adds the grammar implementation of protobuf
Collection nesting syntax is not supported
Supports nested collection syntax
Simplified protobuf syntax, no enumeration, no oneof, no optional
| Back | FazBrowse Home | New Git URL |