From cf87e673a5b0f8c28fcd91622c91bfb1e153512e Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Mon, 6 Jun 2022 21:08:15 +0800 Subject: [PATCH 1/3] =?UTF-8?q?perf[protocol]:=20=E6=94=AF=E6=8C=81TypeScr?= =?UTF-8?q?ipt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++--- .../main/java/com/zfoo/net/config/model/NetConfig.java | 9 +++++++++ .../java/com/zfoo/net/packet/service/PacketService.java | 3 +++ .../java/com/zfoo/net/schema/NetDefinitionParser.java | 1 + net/src/main/resources/net-1.0.xsd | 1 + .../com/zfoo/protocol/registration/ProtocolAnalysis.java | 2 ++ .../protocol/serializer/typescript/GenerateTsUtils.java | 1 + .../serializer/typescript/TsArraySerializer.java | 4 ++-- .../protocol/serializer/typescript/TsListSerializer.java | 4 ++-- .../protocol/serializer/typescript/TsMapSerializer.java | 4 ++-- .../protocol/serializer/typescript/TsSetSerializer.java | 4 ++-- 11 files changed, 27 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 836504c2..dbde4c0a 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,8 @@ ----------- Why is zfoo protocol ? ----------- -- 目前的Java二进制序列化和反序列化速度最快的框架,并且为序列化字节最少的框架 -- 自定义协议格式的私有化序列化框架,同时能够前后兼容,更加安全,防止破解 -- 协议目前原生支持 C++ Java Javascript C# Lua GDScript,可以轻易实现跨平台 +- 目前的Java二进制序列化和反序列化速度最快的自定义格式框架,并且为序列化字节最少的框架,更加安全,可前后兼容 +- 协议目前原生支持 C++ C# Java Javascript TypeScript GDScript Lua,可以轻易实现跨平台 - 单线程的Benchmark测试中,序列化和反序列化速度比Protobuf快50%,比Kryo快100% Ⅰ. zfoo简介🚩 diff --git a/net/src/main/java/com/zfoo/net/config/model/NetConfig.java b/net/src/main/java/com/zfoo/net/config/model/NetConfig.java index 9a7f944b..016653d8 100644 --- a/net/src/main/java/com/zfoo/net/config/model/NetConfig.java +++ b/net/src/main/java/com/zfoo/net/config/model/NetConfig.java @@ -36,6 +36,7 @@ public class NetConfig { private String protocolParam; // 是否生成对应语言的协议 private boolean javascriptProtocol; + private boolean typescriptProtocol; private boolean csharpProtocol; private boolean luaProtocol; private boolean gdscriptProtocol; @@ -173,6 +174,14 @@ public class NetConfig { this.cppProtocol = cppProtocol; } + public boolean isTypescriptProtocol() { + return typescriptProtocol; + } + + public void setTypescriptProtocol(boolean typescriptProtocol) { + this.typescriptProtocol = typescriptProtocol; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/net/src/main/java/com/zfoo/net/packet/service/PacketService.java b/net/src/main/java/com/zfoo/net/packet/service/PacketService.java index aed15499..411b3119 100644 --- a/net/src/main/java/com/zfoo/net/packet/service/PacketService.java +++ b/net/src/main/java/com/zfoo/net/packet/service/PacketService.java @@ -90,6 +90,9 @@ public class PacketService implements IPacketService { if (netConfig.isJavascriptProtocol()) { generateOperation.getGenerateLanguages().add(CodeLanguage.JavaScript); } + if (netConfig.isTypescriptProtocol()) { + generateOperation.getGenerateLanguages().add(CodeLanguage.TypeScript); + } if (netConfig.isCsharpProtocol()) { generateOperation.getGenerateLanguages().add(CodeLanguage.CSharp); } diff --git a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java index 552bbbe1..1d541a60 100644 --- a/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java +++ b/net/src/main/java/com/zfoo/net/schema/NetDefinitionParser.java @@ -90,6 +90,7 @@ public class NetDefinitionParser implements BeanDefinitionParser { resolvePlaceholder("id", "id", builder, element, parserContext); resolvePlaceholder("protocol-location", "protocolLocation", builder, element, parserContext); resolvePlaceholder("javascript-protocol", "javascriptProtocol", builder, element, parserContext); + resolvePlaceholder("typescript-protocol", "typescriptProtocol", builder, element, parserContext); resolvePlaceholder("csharp-protocol", "csharpProtocol", builder, element, parserContext); resolvePlaceholder("lua-protocol", "luaProtocol", builder, element, parserContext); resolvePlaceholder("gdscript-protocol", "gdscriptProtocol", builder, element, parserContext); diff --git a/net/src/main/resources/net-1.0.xsd b/net/src/main/resources/net-1.0.xsd index 89150b4c..be4352e1 100644 --- a/net/src/main/resources/net-1.0.xsd +++ b/net/src/main/resources/net-1.0.xsd @@ -67,6 +67,7 @@ + diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java index 0b0c17f6..4b5354ab 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java @@ -31,6 +31,7 @@ import com.zfoo.protocol.serializer.javascript.GenerateJsUtils; import com.zfoo.protocol.serializer.lua.GenerateLuaUtils; import com.zfoo.protocol.serializer.protobuf.GenerateProtobufUtils; import com.zfoo.protocol.serializer.reflect.*; +import com.zfoo.protocol.serializer.typescript.GenerateTsUtils; import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.ReflectionUtils; import com.zfoo.protocol.util.StringUtils; @@ -205,6 +206,7 @@ public class ProtocolAnalysis { GenerateCppUtils.clear(); GenerateCsUtils.clear(); GenerateJsUtils.clear(); + GenerateTsUtils.clear(); GenerateLuaUtils.clear(); GenerateGdUtils.clear(); GenerateProtobufUtils.clear(); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/GenerateTsUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/GenerateTsUtils.java index 7bcf5082..4a153c8b 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/GenerateTsUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/GenerateTsUtils.java @@ -77,6 +77,7 @@ public abstract class GenerateTsUtils { public static void clear() { protocolOutputRootPath = null; + tsSerializerMap = null; } public static void createProtocolManager(List protocolList) throws IOException { diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsArraySerializer.java index 1ad0e481..1c6eca4a 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsArraySerializer.java @@ -40,7 +40,7 @@ public class TsArraySerializer implements ITsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownArraySerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.JavaScript)) { + if (CutDownArraySerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.TypeScript)) { return; } @@ -69,7 +69,7 @@ public class TsArraySerializer implements ITsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownArraySerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.JavaScript); + var cutDown = CutDownArraySerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.TypeScript); if (cutDown != null) { return cutDown; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java index 415449b5..b433c789 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsListSerializer.java @@ -40,7 +40,7 @@ public class TsListSerializer implements ITsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownListSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.JavaScript)) { + if (CutDownListSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.TypeScript)) { return; } @@ -69,7 +69,7 @@ public class TsListSerializer implements ITsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownListSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.JavaScript); + var cutDown = CutDownListSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.TypeScript); if (cutDown != null) { return cutDown; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java index 6bbcf2e1..2a211a1d 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsMapSerializer.java @@ -40,7 +40,7 @@ public class TsMapSerializer implements ITsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownMapSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.JavaScript)) { + if (CutDownMapSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.TypeScript)) { return; } @@ -73,7 +73,7 @@ public class TsMapSerializer implements ITsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownMapSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.JavaScript); + var cutDown = CutDownMapSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.TypeScript); if (cutDown != null) { return cutDown; } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java index b64f188b..23604d08 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/typescript/TsSetSerializer.java @@ -40,7 +40,7 @@ public class TsSetSerializer implements ITsSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - if (CutDownSetSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.JavaScript)) { + if (CutDownSetSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.TypeScript)) { return; } @@ -70,7 +70,7 @@ public class TsSetSerializer implements ITsSerializer { @Override public String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration) { GenerateProtocolFile.addTab(builder, deep); - var cutDown = CutDownSetSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.JavaScript); + var cutDown = CutDownSetSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.TypeScript); if (cutDown != null) { return cutDown; } From fdae823fe75400ae82f3cc36bb60d94de892179f Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Mon, 6 Jun 2022 21:11:54 +0800 Subject: [PATCH 2/3] =?UTF-8?q?doc[zfoo]:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dbde4c0a..1c7cf608 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ----------- Why is zfoo protocol ? ----------- -- 目前的Java二进制序列化和反序列化速度最快的自定义格式框架,并且为序列化字节最少的框架,更加安全,可前后兼容 +- Java二进制序列化速度最快的自定义格式框架,并且为序列化字节最少的框架,更加安全,可前后兼容 - 协议目前原生支持 C++ C# Java Javascript TypeScript GDScript Lua,可以轻易实现跨平台 - 单线程的Benchmark测试中,序列化和反序列化速度比Protobuf快50%,比Kryo快100% From 736017743a59ba17180eacf5f7b8c9a443ac648a Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Mon, 6 Jun 2022 21:24:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?doc[protocol]:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/README.md | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/protocol/README.md b/protocol/README.md index f91e7b25..d18f3845 100644 --- a/protocol/README.md +++ b/protocol/README.md @@ -71,9 +71,9 @@ cpu: i9900k 复杂对象,zfoo包体大小2216,kryo包体大小2528,protobuf包体大小5091 ``` -### Ⅵ. 协议规范 +### Ⅵ. 数据类型 -- 协议类必须实现com.zfoo.protocol.model.packet.IPacket接口,协议类的的protocolId不能重复 +- 为了代码的优雅,协议类必须实现com.zfoo.protocol.model.packet.IPacket接口,协议类的的protocolId不能重复,但是可以保证不损失性能的情况下支持不继承IPacket的设计 - 协议类必须有一个标识为:public static final transient short PROTOCOL_ID的"协议序列号",这个协议号的值必须和IPacket接口返回的值一样 - 协议类必须是简单的javabean,不能继承任何其它的类,但是可以继承接口 @@ -93,17 +93,9 @@ cpu: i9900k - 自定义泛型类XXXClass,泛型类在很多框架中都极易出现性能上和解析上的问题,而且并不是所有语言都支持 - 循环引用,虽然底层支持循环引用,但是考虑到循环引用带来语义上难以理解,容易出现错误,所以就屏蔽了 -### Ⅶ. 待解决的问题 +### Ⅶ. 协议规范 -- 为了代码的优雅,zfoo protocol要求全部的协议类都要继承IPacket,但是可以保证不损失性能的情况下支持不继承IPacket的设计,这个有待继续讨论。 - -- 协议类修改 - - 修改字段名称过后无法解析,内部默认使用字段的名称按照字符串的自然顺序来依次读写的(也可以自定义),所以修改名称会导致读写顺序变化导致出现异常 - - 减少字段无法解析,没必要一定要删除一个不需要的字段,所以不考虑这种情况 - - 增加字段,需要加上Compatible,order需要自然增大 - -``` -设计模式六大原则中的开闭原则是对扩展开放,对修改关闭。协议的设计涉及到功能应该也要遵守这个原则,优先增加新的协议而不是修改现有协议。 - -协议类修改,可以考虑通过版本号去控制,或者增加新的协议类去解决(组合大于继承,协议类应该对扩展开放,对修改关闭) -``` +- 如果为了版本兼容,增加字段,需要加上Compatible注解,order需要自然增大,这样就可以保证新老协议可以互相兼容 +- 正式环境为了版本兼容,避免修改字段名称,内部默认使用字段的名称按照字符串的自然顺序来依次读写的(也可以自定义),所以会导致序列化出现异常 +- 正式环境为了版本兼容,避免减少字段,没必要一定要删除一个不需要的字段,所以不考虑支持这种减少字段兼容协议的情况 +- 设计模式六大原则中的开闭原则是对扩展开放,对修改关闭。协议的设计涉及到功能应该也要遵守这个原则,优先增加新的协议而不是修改现有协议