,泛型类在很多框架中都极易出现性能上和解析上的问题,而且并不是所有语言都支持
+ - 循环引用,虽然底层支持循环引用,但是考虑到循环引用带来语义上难以理解,容易出现错误,所以就屏蔽了
-### Ⅵ. 用途
+### Ⅶ. 待解决的问题
-- 通信协议
-- 对象复制,深克隆
+- 为了代码的优雅,zfoo protocol要求全部的协议类都要继承IPacket,但是可以保证不损失性能的情况下支持不继承IPacket的设计,这个有待继续讨论。
+
+- 协议类修改
+ - 修改字段名称过后无法解析,内部默认使用字段的名称按照字符串的自然顺序来依次读写的(也可以自定义),所以修改名称会导致读写顺序变化导致出现异常
+ - 减少字段无法解析,没必要一定要删除一个不需要的字段,所以不考虑这种情况
+ - 增加字段,需要加上Compatible,order需要自然增大
+
+```
+设计模式六大原则中的开闭原则是对扩展开放,对修改关闭。协议的设计涉及到功能应该也要遵守这个原则,优先增加新的协议而不是修改现有协议。
+
+协议类修改,可以考虑通过版本号去控制,或者增加新的协议类去解决(组合大于继承,协议类应该对扩展开放,对修改关闭)
+```
diff --git a/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java b/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java
index 9a4f5c70..03f61c9d 100644
--- a/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java
+++ b/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java
@@ -15,10 +15,8 @@ package com.zfoo.protocol;
import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.io.ByteBufferInput;
-import com.esotericsoftware.kryo.io.ByteBufferOutput;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.unsafe.UnsafeInput;
+import com.esotericsoftware.kryo.unsafe.UnsafeOutput;
import com.google.protobuf.ByteString;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -33,7 +31,6 @@ import io.netty.buffer.UnpooledUnsafeHeapByteBuf;
import org.junit.Ignore;
import org.junit.Test;
-import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
@@ -54,8 +51,8 @@ public class SpeedTest {
*
* 包体大小:
* 简单对象,zfoo包体大小8,kryo包体大小5,protobuf包体大小8
- * 常规对象,zfoo包体大小547,kryo包体大小594,protobuf包体大小984
- * 复杂对象,zfoo包体大小2214,kryo包体大小2525,protobuf包体大小5091
+ * 常规对象,zfoo包体大小430,kryo包体大小483,protobuf包体大小793
+ * 复杂对象,zfoo包体大小2216,kryo包体大小2528,protobuf包体大小5091
*/
@Ignore
@Test
@@ -140,8 +137,8 @@ public class SpeedTest {
public void kryoTest() {
var kryo = kryos.get();
- var output = new Output(1024 * 8);
- var input = new Input(output.getBuffer());
+ var output = new UnsafeOutput(1024 * 8);
+ var input = new UnsafeInput(output.getBuffer());
// 序列化和反序列化简单对象
long startTime = System.currentTimeMillis();