From 170d5ef904eea35bd49ded86eb4ddfc9c40e7d87 Mon Sep 17 00:00:00 2001 From: godotg Date: Tue, 17 Oct 2023 16:42:05 +0800 Subject: [PATCH] feat[csharp]: csharp support compatible field --- .../serializer/csharp/GenerateCsUtils.java | 17 ++++++++++++++--- .../resources/csharp/ProtocolManagerTemplate.cs | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/csharp/GenerateCsUtils.java b/protocol/src/main/java/com/zfoo/protocol/serializer/csharp/GenerateCsUtils.java index 7bcf6659..2545c99c 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/csharp/GenerateCsUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/csharp/GenerateCsUtils.java @@ -189,11 +189,20 @@ public abstract class GenerateCsUtils { var fields = registration.getFields(); var fieldRegistrations = registration.getFieldRegistrations(); var csBuilder = new StringBuilder(); + if (registration.isCompatible()) { + csBuilder.append("int beforeWriteIndex = buffer.WriteOffset();").append(LS); + csBuilder.append(TAB + TAB + TAB).append(StringUtils.format("buffer.WriteInt({});", registration.getPredictionLength())).append(LS); + } else { + csBuilder.append(TAB + TAB + TAB).append("buffer.WriteInt(-1);").append(LS); + } for (var i = 0; i < fields.length; i++) { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; csSerializer(fieldRegistration.serializer()).writeObject(csBuilder, "message." + field.getName(), 3, field, fieldRegistration); } + if (registration.isCompatible()) { + csBuilder.append(TAB + TAB + TAB).append(StringUtils.format("buffer.AdjustPadding({}, beforeWriteIndex);", registration.getPredictionLength())).append(LS); + } return csBuilder.toString(); } @@ -205,11 +214,13 @@ public abstract class GenerateCsUtils { for (var i = 0; i < fields.length; i++) { var field = fields[i]; var fieldRegistration = fieldRegistrations[i]; + if (field.isAnnotationPresent(Compatible.class)) { - csBuilder.append(TAB + TAB + TAB).append("if (!buffer.IsReadable())").append(LS); - csBuilder.append(TAB + TAB + TAB).append("{").append(LS); - csBuilder.append(TAB + TAB + TAB + TAB).append("return packet;").append(LS); + csBuilder.append(TAB + TAB + TAB).append("if (buffer.CompatibleRead(beforeReadIndex, length)) {").append(LS); + var compatibleReadObject = csSerializer(fieldRegistration.serializer()).readObject(csBuilder, 4, field, fieldRegistration); + csBuilder.append(TAB + TAB + TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), compatibleReadObject)).append(LS); csBuilder.append(TAB + TAB + TAB).append("}").append(LS); + continue; } var readObject = csSerializer(fieldRegistration.serializer()).readObject(csBuilder, 3, field, fieldRegistration); csBuilder.append(TAB + TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), readObject)).append(LS); diff --git a/protocol/src/main/resources/csharp/ProtocolManagerTemplate.cs b/protocol/src/main/resources/csharp/ProtocolManagerTemplate.cs index 03c480bc..48d54661 100644 --- a/protocol/src/main/resources/csharp/ProtocolManagerTemplate.cs +++ b/protocol/src/main/resources/csharp/ProtocolManagerTemplate.cs @@ -30,7 +30,7 @@ namespace zfoocs public static void Write(ByteBuffer buffer, object packet) { - var protocolId = packet.ProtocolId(); + var protocolId = protocolIdMap[packet.GetType()]; // 写入协议号 buffer.WriteShort(protocolId);