From 174449bcd036e06603c810f1a85ff69b391db7dd Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Thu, 10 Aug 2023 02:26:12 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20cs=20=E5=BA=8F=E5=88=97=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BF=AE=E6=AD=A3=20=E9=BB=98=E8=AE=A4=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=A4=A7=E7=AB=AF=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/writeCs/gCsCode.cs | 295 ++++++++- src/writeCs/gCsField.erl | 67 +- src/writeCs/gCsGen.erl | 93 ++- src/writeCs/sample/ProtocolMsg.cs | 598 ----------------- src/writeCs/sample/cs序列化1.jpg | Bin 78789 -> 0 bytes src/writeCs/sample/cs序列化2.png | Bin 18265 -> 0 bytes test/protoMsg.cs | 962 ++++++++++++++++++++-------- 7 files changed, 1040 insertions(+), 975 deletions(-) delete mode 100644 src/writeCs/sample/ProtocolMsg.cs delete mode 100644 src/writeCs/sample/cs序列化1.jpg delete mode 100644 src/writeCs/sample/cs序列化2.png diff --git a/src/writeCs/gCsCode.cs b/src/writeCs/gCsCode.cs index 447ea52..ea5acf3 100644 --- a/src/writeCs/gCsCode.cs +++ b/src/writeCs/gCsCode.cs @@ -1,14 +1,30 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Data; using System.IO; +using MiscUtil.Conversion; +using MiscUtil.IO; -namespace ProtoMsg +namespace GenProto { - public static class Protocol + public static class ProtocolCore { + public interface ISerialize + { + void Serialize(EndianBinaryWriter binaryWriter); + byte[] Serialize(); + } + + public interface IDeserialize + { + void Deserialize(EndianBinaryReader binaryReader); + void Deserialize(byte[] data); + } + public enum BasicTypeEnum { + Custom = 0x00, Boolean = 0x01, Int8 = 0x02, UInt8 = 0x03, @@ -39,11 +55,11 @@ namespace ProtoMsg float => BasicTypeEnum.Float, double => BasicTypeEnum.Double, string => BasicTypeEnum.String, - _ => throw new InvalidOperationException($"unexpect type: {value.GetType().FullName}") + _ => BasicTypeEnum.Custom, }; } - public static void WriteValue(this BinaryWriter binaryWriter, T value) + public static void WriteValue(this EndianBinaryWriter binaryWriter, T value) { switch (value) { @@ -81,46 +97,134 @@ namespace ProtoMsg binaryWriter.Write(doubleValue); break; case string stringValue: - binaryWriter.Write(stringValue); + var bytesLength = (ushort)binaryWriter.Encoding.GetByteCount(stringValue); + binaryWriter.Write(bytesLength); + var bytes = binaryWriter.Encoding.GetBytes(stringValue); + binaryWriter.Write(bytes); break; default: - throw new InvalidOperationException($"unexpect type: {value.GetType().FullName}"); + { + switch (value) + { + case IList listValue: + binaryWriter.WriteList(listValue); + break; + case ISerialize serialize: + serialize.Serialize(binaryWriter); + break; + default: + if (value != null) + { + throw new InvalidOperationException($"unexpect type: {value.GetType().FullName}"); + } + + break; + } + break; + } } } - public static void WriteList(this BinaryWriter binaryWriter, IList list) + public static void WriteList(this EndianBinaryWriter binaryWriter, IList list) { - var length = (ushort) (list?.Count ?? 0); + var length = (ushort)(list?.Count ?? 0); binaryWriter.Write(length); if (list == null) return; for (var idx = 0; idx < length; idx++) { var value = list[idx]; + binaryWriter.WriteValue(value); + } + } - if (idx == 0) - { - var basicType = JudgeType(value); - binaryWriter.Write((byte) basicType); - } + public static void ReadValue(this EndianBinaryReader binaryReader, out bool value) + { + value = binaryReader.ReadBoolean(); + } - binaryWriter.WriteValue(value); + public static void ReadValue(this EndianBinaryReader binaryReader, out sbyte value) + { + value = binaryReader.ReadSByte(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out byte value) + { + value = binaryReader.ReadByte(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out ushort value) + { + value = binaryReader.ReadUInt16(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out short value) + { + value = binaryReader.ReadInt16(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out int value) + { + value = binaryReader.ReadInt32(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out uint value) + { + value = binaryReader.ReadUInt32(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out long value) + { + value = binaryReader.ReadInt64(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out ulong value) + { + value = binaryReader.ReadUInt64(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out float value) + { + value = binaryReader.ReadSingle(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out double value) + { + value = binaryReader.ReadDouble(); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out string value) + { + var bytesLength = binaryReader.ReadUInt16(); + var bytes = binaryReader.ReadBytes(bytesLength); + value = binaryReader.Encoding.GetString(bytes, 0, bytes.Length); + } + + public static void ReadValue(this EndianBinaryReader binaryReader, out T value) where T : new() + { + value = default; + value = new T(); + if (value is not IDeserialize deserialize) + { + throw new InvalidOperationException($"error type: {typeof(T).FullName}"); } + + deserialize.Deserialize(binaryReader); } - public static void ReadList(this BinaryReader binaryReader, out IList list) + public static void ReadValue(this EndianBinaryReader binaryReader, out List outList, BasicTypeEnum basicTypeEnum) where T : new() { + outList = default; + IList list = default; + var length = binaryReader.ReadUInt16(); if (length <= 0) { - list = default; return; } - list = default; - var basicTypeEnum = (BasicTypeEnum) binaryReader.ReadByte(); - for (int idx = 0; idx < length; idx++) + for (var idx = 0; idx < length; idx++) { switch (basicTypeEnum) { @@ -184,18 +288,147 @@ namespace ProtoMsg var stringValue = binaryReader.ReadString(); list.Add(stringValue); break; + case BasicTypeEnum.Custom: + list ??= new List(length); + if (new T() is IDeserialize item) + { + item.Deserialize(binaryReader); + list.Add(item); + } + break; default: - throw new ArgumentOutOfRangeException(); + throw new InvalidOperationException(); } } + + outList = list as List; } } -} + + public class test : ProtocolCore.ISerialize, ProtocolCore.IDeserialize + { + public const int ProtoId = 1; + public string aa; + + public byte[] Serialize(bool bigEndian = true) + { + using var memoryStream = new MemoryStream(); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); + Serialize(binaryWriter); + return memoryStream.ToArray(); + } + + public void Deserialize(byte[] data, bool bigEndian = true) + { + using var memoryStream = new MemoryStream(data); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); + Deserialize(binaryReader); + } + + public void Serialize(EndianBinaryWriter binaryWriter) + { + binaryWriter.WriteValue(aa); + } + + public void Deserialize(EndianBinaryReader binaryReader) + { + binaryReader.ReadValue(out aa); + } + } + + public class phoneNumber : ProtocolCore.ISerialize, ProtocolCore.IDeserialize + { + public const int ProtoId = 2; + public test number; + public int type; + + public byte[] Serialize() + { + using var memoryStream = new MemoryStream(); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); + Serialize(binaryWriter); + return memoryStream.ToArray(); + } + + public void Deserialize(byte[] data) + { + using var memoryStream = new MemoryStream(data); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); + Deserialize(binaryReader); + } + + public void Serialize(EndianBinaryWriter binaryWriter) + { + binaryWriter.WriteValue(number); + binaryWriter.WriteValue(type); + } + + public void Deserialize(EndianBinaryReader binaryReader) + { + binaryReader.ReadValue(out number); + binaryReader.ReadValue(out type); + } + } + + public class person : ProtocolCore.ISerialize, ProtocolCore.IDeserialize + { + public const int ProtoId = 3; + public string name; + public int id; + public string email; + public List phone; + + public byte[] Serialize() + { + using var memoryStream = new MemoryStream(); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); + Serialize(binaryWriter); + return memoryStream.ToArray(); + } + + public void Deserialize(byte[] data) + { + using var memoryStream = new MemoryStream(data); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); + Deserialize(binaryReader); + } + + public void Serialize(EndianBinaryWriter binaryWriter) + { + binaryWriter.WriteValue(name); + binaryWriter.WriteValue(id); + binaryWriter.WriteValue(email); + if (xx != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(phone); + } + else + { + + } + binaryWriter.WriteValue(phone); + } + + public void Deserialize(EndianBinaryReader binaryReader) + { + binaryReader.ReadValue(out name); + binaryReader.ReadValue(out id); + binaryReader.ReadValue(out email); + binaryReader.ReadValue(out phone, 0x00); + } + } + + public class addressBook : ProtocolCore.ISerialize, ProtocolCore.IDeserialize + { + public const int ProtoId = 4; + public List person; + public List other; public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -203,6 +436,20 @@ namespace ProtoMsg public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); - } \ No newline at end of file + } + + public void Serialize(EndianBinaryWriter binaryWriter) + { + binaryWriter.WriteValue(person); + binaryWriter.WriteValue(other); + } + + public void Deserialize(EndianBinaryReader binaryReader) + { + binaryReader.ReadValue(out person); + binaryReader.ReadValue(out other); + } + } +} \ No newline at end of file diff --git a/src/writeCs/gCsField.erl b/src/writeCs/gCsField.erl index 44c5dc1..0c8a7cc 100644 --- a/src/writeCs/gCsField.erl +++ b/src/writeCs/gCsField.erl @@ -15,31 +15,32 @@ , <<"double">> ]). +-define(CustomTypeEnum, <<"0x00">>). -define(TypeValue, [ - {<<"bool">>, <<"bool">>} - , {<<"int8">>, <<"sbyte">>} - , {<<"uint8">>, <<"byte">>} - , {<<"int16">>, <<"short">>} - , {<<"uint16">>, <<"ushort">>} - , {<<"int32">>, <<"int">>} - , {<<"uint32">>, <<"uint">>} - , {<<"int64">>, <<"long">>} - , {<<"uint64">>, <<"ulong">>} - , {<<"float">>, <<"float">>} - , {<<"double">>, <<"double">>} - , {<<"string">>, <<"string">>} + {<<"bool">>, <<"bool">>, <<"0x01">>} + , {<<"int8">>, <<"sbyte">>, <<"0x02">>} + , {<<"uint8">>, <<"byte">>, <<"0x03">>} + , {<<"int16">>, <<"short">>, <<"0x04">>} + , {<<"uint16">>, <<"ushort">>, <<"0x05">>} + , {<<"int32">>, <<"int">>, <<"0x06">>} + , {<<"uint32">>, <<"uint">>, <<"0x07">>} + , {<<"int64">>, <<"long">>, <<"0x08">>} + , {<<"uint64">>, <<"ulong">>, <<"0x09">>} + , {<<"float">>, <<"float">>, <<"0x10">>} + , {<<"double">>, <<"double">>, <<"0x11">>} + , {<<"string">>, <<"string">>, <<"0x12">>} ]). builtMemberStr({TypeStr, NameStr}) -> case lists:keyfind(TypeStr, 1, ?TypeValue) of - {TypeStr, CSTypeStr} -> + {TypeStr, CSTypeStr, _TypeEnumVale} -> <<"\t\tpublic ", CSTypeStr/binary, " ", NameStr/binary, ";\n">>; _ -> case TypeStr of <<"list[", LeftStr/binary>> -> [SubTypeStr | _] = re:split(LeftStr, <<"\\]">>, [{return, binary}]), case lists:keyfind(SubTypeStr, 1, ?TypeValue) of - {SubTypeStr, SubCSTypeStr} -> + {SubTypeStr, SubCSTypeStr, _TypeEnumVale} -> <<"\t\tpublic List<", SubCSTypeStr/binary, "> ", NameStr/binary, ";\n">>; _ -> <<"\t\tpublic List<", SubTypeStr/binary, "> ", NameStr/binary, ";\n">> @@ -48,3 +49,41 @@ builtMemberStr({TypeStr, NameStr}) -> <<"\t\tpublic ", TypeStr/binary, " ", NameStr/binary, ";\n">> end end. + +builtEncodeStr({TypeStr, NameStr}) -> + case lists:keyfind(TypeStr, 1, ?TypeValue) of + {TypeStr, _CSTypeStr, _TypeEnumVale} -> + <<"\t\t\tbinaryWriter.WriteValue(", NameStr/binary, ");\n">>; + _ -> + case TypeStr of + <<"list[", LeftStr/binary>> -> + [SubTypeStr | _] = re:split(LeftStr, <<"\\]">>, [{return, binary}]), + case lists:keyfind(SubTypeStr, 1, ?TypeValue) of + {SubTypeStr, _CSTypeStr, _TypeEnumVale} -> + <<"\t\t\tbinaryWriter.WriteValue(", NameStr/binary, ");\n">>; + _ -> + <<"\t\t\tbinaryWriter.WriteValue(", NameStr/binary, ");\n">> + end; + _ -> + <<"\t\t\tif (", NameStr/binary, " != null)\n\t\t\t{\n\t\t\t\tbinaryWriter.WriteValue(1);\n\t\t\t\tbinaryWriter.WriteValue(", NameStr/binary, ");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbinaryWriter.WriteValue(0);\n\t\t\t}\n">> + end + end. + +builtDecodeStr({TypeStr, NameStr}) -> + case lists:keyfind(TypeStr, 1, ?TypeValue) of + {TypeStr, _CSTypeStr, _TypeEnumVale} -> + <<"\t\t\tbinaryReader.ReadValue(out ", NameStr/binary, ");\n">>; + _ -> + case TypeStr of + <<"list[", LeftStr/binary>> -> + [SubTypeStr | _] = re:split(LeftStr, <<"\\]">>, [{return, binary}]), + case lists:keyfind(SubTypeStr, 1, ?TypeValue) of + {SubTypeStr, _CSTypeStr, TypeEnumVale} -> + <<"\t\t\tbinaryReader.ReadValue(out ", NameStr/binary, ", ", TypeEnumVale/binary, ");\n">>; + _ -> + <<"\t\t\tbinaryReader.ReadValue(out ", NameStr/binary,", ", (?CustomTypeEnum)/binary, ");\n">> + end; + _ -> + <<"\t\t\tif (binaryReader.ReadBoolean())\n\t\t\t{\n\t\t\t\tbinaryReader.ReadValue(out ", NameStr/binary, ");\n\t\t\t}\n">> + end + end. diff --git a/src/writeCs/gCsGen.erl b/src/writeCs/gCsGen.erl index 5cda89a..b25140e 100644 --- a/src/writeCs/gCsGen.erl +++ b/src/writeCs/gCsGen.erl @@ -5,11 +5,13 @@ ]). protoHeader() -> - <<"using System; +<<"using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; +using MiscUtil.Conversion; +using MiscUtil.IO; namespace GenProto { @@ -17,13 +19,13 @@ namespace GenProto { public interface ISerialize { - void Serialize(BinaryWriter binaryWriter); + void Serialize(EndianBinaryWriter binaryWriter); byte[] Serialize(); } public interface IDeserialize { - void Deserialize(BinaryReader binaryReader); + void Deserialize(EndianBinaryReader binaryReader); void Deserialize(byte[] data); } @@ -64,7 +66,7 @@ namespace GenProto }; } - public static void WriteValue(this BinaryWriter binaryWriter, T value) + public static void WriteValue(this EndianBinaryWriter binaryWriter, T value) { switch (value) { @@ -102,11 +104,13 @@ namespace GenProto binaryWriter.Write(doubleValue); break; case string stringValue: - binaryWriter.Write(stringValue); + var bytesLength = (ushort)binaryWriter.Encoding.GetByteCount(stringValue); + binaryWriter.Write(bytesLength); + var bytes = binaryWriter.Encoding.GetBytes(stringValue); + binaryWriter.Write(bytes); break; default: { - binaryWriter.Write(value != null); switch (value) { case IList listValue: @@ -123,104 +127,92 @@ namespace GenProto break; } - break; } } } - public static void WriteList(this BinaryWriter binaryWriter, IList list) + public static void WriteList(this EndianBinaryWriter binaryWriter, IList list) { - var length = (ushort) (list?.Count ?? 0); + var length = (ushort)(list?.Count ?? 0); binaryWriter.Write(length); if (list == null) return; for (var idx = 0; idx < length; idx++) { var value = list[idx]; - - if (idx == 0) - { - var basicType = JudgeType(value); - binaryWriter.Write((byte) basicType); - } - binaryWriter.WriteValue(value); } } - public static void ReadValue(this BinaryReader binaryReader, out bool value) + public static void ReadValue(this EndianBinaryReader binaryReader, out bool value) { value = binaryReader.ReadBoolean(); } - public static void ReadValue(this BinaryReader binaryReader, out sbyte value) + public static void ReadValue(this EndianBinaryReader binaryReader, out sbyte value) { value = binaryReader.ReadSByte(); } - public static void ReadValue(this BinaryReader binaryReader, out byte value) + public static void ReadValue(this EndianBinaryReader binaryReader, out byte value) { value = binaryReader.ReadByte(); } - public static void ReadValue(this BinaryReader binaryReader, out ushort value) + public static void ReadValue(this EndianBinaryReader binaryReader, out ushort value) { value = binaryReader.ReadUInt16(); } - public static void ReadValue(this BinaryReader binaryReader, out short value) + public static void ReadValue(this EndianBinaryReader binaryReader, out short value) { value = binaryReader.ReadInt16(); } - public static void ReadValue(this BinaryReader binaryReader, out int value) + public static void ReadValue(this EndianBinaryReader binaryReader, out int value) { value = binaryReader.ReadInt32(); } - public static void ReadValue(this BinaryReader binaryReader, out uint value) + public static void ReadValue(this EndianBinaryReader binaryReader, out uint value) { value = binaryReader.ReadUInt32(); } - public static void ReadValue(this BinaryReader binaryReader, out long value) + public static void ReadValue(this EndianBinaryReader binaryReader, out long value) { value = binaryReader.ReadInt64(); } - public static void ReadValue(this BinaryReader binaryReader, out ulong value) + public static void ReadValue(this EndianBinaryReader binaryReader, out ulong value) { value = binaryReader.ReadUInt64(); } - public static void ReadValue(this BinaryReader binaryReader, out float value) + public static void ReadValue(this EndianBinaryReader binaryReader, out float value) { value = binaryReader.ReadSingle(); } - public static void ReadValue(this BinaryReader binaryReader, out double value) + public static void ReadValue(this EndianBinaryReader binaryReader, out double value) { value = binaryReader.ReadDouble(); } - public static void ReadValue(this BinaryReader binaryReader, out string value) + public static void ReadValue(this EndianBinaryReader binaryReader, out string value) { - value = binaryReader.ReadString(); + var bytesLength = binaryReader.ReadUInt16(); + var bytes = binaryReader.ReadBytes(bytesLength); + value = binaryReader.Encoding.GetString(bytes, 0, bytes.Length); } - public static void ReadValue(this BinaryReader binaryReader, out T value) where T : new() + public static void ReadValue(this EndianBinaryReader binaryReader, out T value) where T : new() { value = default; - var haveValue = binaryReader.ReadBoolean(); - if (!haveValue) - { - return; - } - value = new T(); - if (!(value is IDeserialize deserialize)) + if (value is not IDeserialize deserialize) { throw new InvalidOperationException($\"error type: {typeof(T).FullName}\"); } @@ -228,15 +220,10 @@ namespace GenProto deserialize.Deserialize(binaryReader); } - public static void ReadValue(this BinaryReader binaryReader, out List outList) where T : new() + public static void ReadValue(this EndianBinaryReader binaryReader, out List outList, BasicTypeEnum basicTypeEnum) where T : new() { outList = default; IList list = default; - var haveValue = binaryReader.ReadBoolean(); - if (!haveValue) - { - return; - } var length = binaryReader.ReadUInt16(); if (length <= 0) @@ -244,7 +231,6 @@ namespace GenProto return; } - var basicTypeEnum = (BasicTypeEnum) binaryReader.ReadByte(); for (var idx = 0; idx < length; idx++) { switch (basicTypeEnum) @@ -311,19 +297,12 @@ namespace GenProto break; case BasicTypeEnum.Custom: list ??= new List(length); - var state = binaryReader.ReadBoolean(); - if (state) - { - if (new T() is IDeserialize item) + if (new T() is IDeserialize item) { item.Deserialize(binaryReader); list.Add(item); } - } - break; - - default: throw new InvalidOperationException(); } @@ -344,7 +323,7 @@ spellClassMember(FieldList) -> spellCalssDSTem() -> <<"\n\t\tpublic byte[] Serialize()\n\t\t{\n\t\t\tusing var memoryStream = new MemoryStream(); -\t\t\tusing var binaryWriter = new BinaryWriter(memoryStream); +\t\t\tusing var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); \t\t\tSerialize(binaryWriter); \t\t\treturn memoryStream.ToArray(); \t\t} @@ -352,18 +331,18 @@ spellCalssDSTem() -> \t\tpublic void Deserialize(byte[] data) \t\t{ \t\t\tusing var memoryStream = new MemoryStream(data); -\t\t\tusing var binaryReader = new BinaryReader(memoryStream); +\t\t\tusing var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); \t\t\tDeserialize(binaryReader); \t\t}\n">>. spellCalssSerialize(FieldList) -> - FunHead = <<"\t\tpublic void Serialize(BinaryWriter binaryWriter)\n\t\t{\n">>, - FunBody = <<<<"\t\t\tbinaryWriter.WriteValue(", NameStr/binary, ");\n">> || {_TypeStr, NameStr} <- FieldList>>, + FunHead = <<"\t\tpublic void Serialize(EndianBinaryWriter binaryWriter)\n\t\t{\n">>, + FunBody = <<<<(gCsField:builtEncodeStr(OneTypeName))/binary>> || OneTypeName <- FieldList>>, <>. spellCalssDeserialize(FieldList) -> FunHead = <<"\t\tpublic void Deserialize(BinaryReader binaryReader)\n\t\t{\n">>, - FunBody = <<<<"\t\t\tbinaryReader.ReadValue(out ", NameStr/binary, ");\n">> || {_TypeStr, NameStr} <- FieldList>>, + FunBody = <<<<(gCsField:builtDecodeStr(OneTypeName))/binary>> || OneTypeName <- FieldList>>, <>. spellClassEnd() -> diff --git a/src/writeCs/sample/ProtocolMsg.cs b/src/writeCs/sample/ProtocolMsg.cs deleted file mode 100644 index 1ae82ce..0000000 --- a/src/writeCs/sample/ProtocolMsg.cs +++ /dev/null @@ -1,598 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.IO; - -namespace GenProto -{ - public static class ProtocolCore - { - public interface ISerialize - { - void Serialize(BinaryWriter binaryWriter); - byte[] Serialize(); - } - - public interface IDeserialize - { - void Deserialize(BinaryReader binaryReader); - void Deserialize(byte[] data); - } - - public enum BasicTypeEnum - { - Custom = 0x00, - Boolean = 0x01, - Int8 = 0x02, - UInt8 = 0x03, - UInt16 = 0x04, - Int16 = 0x05, - Int32 = 0x06, - UInt32 = 0x07, - Int64 = 0x08, - UInt64 = 0x09, - Float = 0x10, - Double = 0x11, - String = 0x12, - } - - public static BasicTypeEnum JudgeType(T value) - { - return value switch - { - bool => BasicTypeEnum.Boolean, - byte => BasicTypeEnum.Int8, - sbyte => BasicTypeEnum.UInt8, - ushort => BasicTypeEnum.UInt16, - short => BasicTypeEnum.Int16, - int => BasicTypeEnum.Int32, - uint => BasicTypeEnum.UInt32, - long => BasicTypeEnum.Int64, - ulong => BasicTypeEnum.UInt64, - float => BasicTypeEnum.Float, - double => BasicTypeEnum.Double, - string => BasicTypeEnum.String, - _ => BasicTypeEnum.Custom, - }; - } - - public static void WriteValue(this BinaryWriter binaryWriter, T value) - { - switch (value) - { - case bool boolValue: - binaryWriter.Write(boolValue); - break; - case byte byteValue: - binaryWriter.Write(byteValue); - break; - case sbyte sbyteValue: - binaryWriter.Write(sbyteValue); - break; - case ushort ushortValue: - binaryWriter.Write(ushortValue); - break; - case short shortValue: - binaryWriter.Write(shortValue); - break; - case int intValue: - binaryWriter.Write(intValue); - break; - case uint uintValue: - binaryWriter.Write(uintValue); - break; - case long longValue: - binaryWriter.Write(longValue); - break; - case ulong ulongValue: - binaryWriter.Write(ulongValue); - break; - case float floatValue: - binaryWriter.Write(floatValue); - break; - case double doubleValue: - binaryWriter.Write(doubleValue); - break; - case string stringValue: - binaryWriter.Write(stringValue); - break; - default: - { - binaryWriter.Write(value != null); - switch (value) - { - case IList listValue: - binaryWriter.WriteList(listValue); - break; - case ISerialize serialize: - serialize.Serialize(binaryWriter); - break; - default: - if (value != null) - { - throw new InvalidOperationException($"unexpect type: {value.GetType().FullName}"); - } - - break; - } - - break; - } - } - } - - - public static void WriteList(this BinaryWriter binaryWriter, IList list) - { - var length = (ushort) (list?.Count ?? 0); - binaryWriter.Write(length); - - if (list == null) return; - for (var idx = 0; idx < length; idx++) - { - var value = list[idx]; - - if (idx == 0) - { - var basicType = JudgeType(value); - binaryWriter.Write((byte) basicType); - } - - binaryWriter.WriteValue(value); - } - } - - public static void ReadValue(this BinaryReader binaryReader, out bool value) - { - value = binaryReader.ReadBoolean(); - } - - public static void ReadValue(this BinaryReader binaryReader, out sbyte value) - { - value = binaryReader.ReadSByte(); - } - - public static void ReadValue(this BinaryReader binaryReader, out byte value) - { - value = binaryReader.ReadByte(); - } - - public static void ReadValue(this BinaryReader binaryReader, out ushort value) - { - value = binaryReader.ReadUInt16(); - } - - public static void ReadValue(this BinaryReader binaryReader, out short value) - { - value = binaryReader.ReadInt16(); - } - - public static void ReadValue(this BinaryReader binaryReader, out int value) - { - value = binaryReader.ReadInt32(); - } - - public static void ReadValue(this BinaryReader binaryReader, out uint value) - { - value = binaryReader.ReadUInt32(); - } - - public static void ReadValue(this BinaryReader binaryReader, out long value) - { - value = binaryReader.ReadInt64(); - } - - public static void ReadValue(this BinaryReader binaryReader, out ulong value) - { - value = binaryReader.ReadUInt64(); - } - - public static void ReadValue(this BinaryReader binaryReader, out float value) - { - value = binaryReader.ReadSingle(); - } - - public static void ReadValue(this BinaryReader binaryReader, out double value) - { - value = binaryReader.ReadDouble(); - } - - public static void ReadValue(this BinaryReader binaryReader, out string value) - { - value = binaryReader.ReadString(); - } - - public static void ReadValue(this BinaryReader binaryReader, out T value) where T : new() - { - value = default; - var haveValue = binaryReader.ReadBoolean(); - if (!haveValue) - { - return; - } - - value = new T(); - if (!(value is IDeserialize deserialize)) - { - throw new InvalidOperationException($"error type: {typeof(T).FullName}"); - } - - deserialize.Deserialize(binaryReader); - } - - public static void ReadValue(this BinaryReader binaryReader, out List outList) where T : new() - { - outList = default; - IList list = default; - var haveValue = binaryReader.ReadBoolean(); - if (!haveValue) - { - return; - } - - var length = binaryReader.ReadUInt16(); - if (length <= 0) - { - return; - } - - var basicTypeEnum = (BasicTypeEnum) binaryReader.ReadByte(); - for (var idx = 0; idx < length; idx++) - { - switch (basicTypeEnum) - { - case BasicTypeEnum.Boolean: - list ??= new List(length); - var boolValue = binaryReader.ReadBoolean(); - list.Add(boolValue); - break; - case BasicTypeEnum.Int8: - list ??= new List(length); - var sbyteValue = binaryReader.ReadSByte(); - list.Add(sbyteValue); - break; - case BasicTypeEnum.UInt8: - list ??= new List(length); - var byteValue = binaryReader.ReadByte(); - list.Add(byteValue); - break; - case BasicTypeEnum.UInt16: - list ??= new List(length); - var ushortValue = binaryReader.ReadUInt16(); - list.Add(ushortValue); - break; - case BasicTypeEnum.Int16: - list ??= new List(length); - var shortValue = binaryReader.ReadInt16(); - list.Add(shortValue); - break; - case BasicTypeEnum.Int32: - list ??= new List(length); - var intValue = binaryReader.ReadInt32(); - list.Add(intValue); - break; - case BasicTypeEnum.UInt32: - list ??= new List(length); - var uintValue = binaryReader.ReadUInt32(); - list.Add(uintValue); - break; - case BasicTypeEnum.Int64: - list ??= new List(length); - var longValue = binaryReader.ReadInt64(); - list.Add(longValue); - break; - case BasicTypeEnum.UInt64: - list ??= new List(length); - var ulongValue = binaryReader.ReadUInt64(); - list.Add(ulongValue); - break; - case BasicTypeEnum.Float: - list ??= new List(length); - var singleValue = binaryReader.ReadSingle(); - list.Add(singleValue); - break; - case BasicTypeEnum.Double: - list ??= new List(length); - var doubleValue = binaryReader.ReadDouble(); - list.Add(doubleValue); - break; - case BasicTypeEnum.String: - list ??= new List(length); - var stringValue = binaryReader.ReadString(); - list.Add(stringValue); - break; - case BasicTypeEnum.Custom: - list ??= new List(length); - var state = binaryReader.ReadBoolean(); - if (state) - { - if (new T() is IDeserialize item) - { - item.Deserialize(binaryReader); - list.Add(item); - } - } - - break; - - - default: - throw new InvalidOperationException(); - } - } - - outList = list as List; - } - } - - public class AllType : ProtocolCore.ISerialize, ProtocolCore.IDeserialize - { - public const int protoId = 11; - public bool Bool; - public sbyte Int8; - public byte UInt8; - public ushort UInt16; - public short Int16; - public int Int32; - public uint UInt32; - public long Int64; - public ulong UInt64; - public float Float; - public double Double; - public string String; - public SubType SubType; - public List ListSubType; - public List ListBool; - public List ListInt8; - public List ListUInt8; - public List ListUInt16; - public List ListInt16; - public List ListInt32; - public List ListUInt32; - public List ListInt64; - public List ListUInt64; - public List ListFloat; - public List ListDouble; - public List ListString; - - public byte[] Serialize() - { - using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); - Serialize(binaryWriter); - return memoryStream.ToArray(); - } - - public void Deserialize(byte[] data) - { - using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); - Deserialize(binaryReader); - } - - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(Bool); - binaryWriter.WriteValue(Int8); - binaryWriter.WriteValue(UInt8); - binaryWriter.WriteValue(UInt16); - binaryWriter.WriteValue(Int16); - binaryWriter.WriteValue(Int32); - binaryWriter.WriteValue(UInt32); - binaryWriter.WriteValue(Int64); - binaryWriter.WriteValue(UInt64); - binaryWriter.WriteValue(Float); - binaryWriter.WriteValue(Double); - binaryWriter.WriteValue(String); - binaryWriter.WriteValue(SubType); - binaryWriter.WriteValue(ListSubType); - binaryWriter.WriteValue(ListBool); - binaryWriter.WriteValue(ListInt8); - binaryWriter.WriteValue(ListUInt8); - binaryWriter.WriteValue(ListUInt16); - binaryWriter.WriteValue(ListInt16); - binaryWriter.WriteValue(ListInt32); - binaryWriter.WriteValue(ListUInt32); - binaryWriter.WriteValue(ListInt64); - binaryWriter.WriteValue(ListUInt64); - binaryWriter.WriteValue(ListFloat); - binaryWriter.WriteValue(ListDouble); - binaryWriter.WriteValue(ListString); - } - - - public void Deserialize(BinaryReader binaryReader) - { - binaryReader.ReadValue(out Bool); - binaryReader.ReadValue(out Int8); - binaryReader.ReadValue(out UInt8); - binaryReader.ReadValue(out UInt16); - binaryReader.ReadValue(out Int16); - binaryReader.ReadValue(out Int32); - binaryReader.ReadValue(out UInt32); - binaryReader.ReadValue(out Int64); - binaryReader.ReadValue(out UInt64); - binaryReader.ReadValue(out Float); - binaryReader.ReadValue(out Double); - binaryReader.ReadValue(out String); - binaryReader.ReadValue(out SubType); - binaryReader.ReadValue(out ListSubType); - binaryReader.ReadValue(out ListBool); - binaryReader.ReadValue(out ListInt8); - binaryReader.ReadValue(out ListUInt8); - binaryReader.ReadValue(out ListUInt16); - binaryReader.ReadValue(out ListInt16); - binaryReader.ReadValue(out ListInt32); - binaryReader.ReadValue(out ListUInt32); - binaryReader.ReadValue(out ListInt64); - binaryReader.ReadValue(out ListUInt64); - binaryReader.ReadValue(out ListFloat); - binaryReader.ReadValue(out ListDouble); - binaryReader.ReadValue(out ListString); - } - } - - public class SubType : ProtocolCore.ISerialize, ProtocolCore.IDeserialize - { - public int Int32; - - public byte[] Serialize() - { - using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); - Serialize(binaryWriter); - return memoryStream.ToArray(); - } - - public void Deserialize(byte[] data) - { - using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); - Deserialize(binaryReader); - } - - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(Int32); - } - - public void Deserialize(BinaryReader binaryReader) - { - binaryReader.ReadValue(out Int32); - } - } - - public class Test : ProtocolCore.ISerialize, ProtocolCore.IDeserialize - { - public string aa; - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(aa); - } - - public byte[] Serialize() - { - using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); - Serialize(binaryWriter); - return memoryStream.ToArray(); - } - - public void Deserialize(BinaryReader binaryReader) - { - binaryReader.ReadValue(out aa); - } - - public void Deserialize(byte[] data) - { - using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); - Deserialize(binaryReader); - } - } - - public class PhoneNumber : ProtocolCore.ISerialize, ProtocolCore.IDeserialize - { - public Test number; - public int type; - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(number); - binaryWriter.WriteValue(type); - } - - public byte[] Serialize() - { - using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); - Serialize(binaryWriter); - return memoryStream.ToArray(); - } - - public void Deserialize(BinaryReader binaryReader) - { - binaryReader.ReadValue(out number); - binaryReader.ReadValue(out type); - } - - public void Deserialize(byte[] data) - { - using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); - Deserialize(binaryReader); - } - } - - public class Person : ProtocolCore.ISerialize, ProtocolCore.IDeserialize - { - public string Name; - public int id; - public string email; - public List phone; - - - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(Name); - binaryWriter.WriteValue(id); - binaryWriter.WriteValue(email); - binaryWriter.WriteValue(phone); - } - - public byte[] Serialize() - { - using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); - Serialize(binaryWriter); - return memoryStream.ToArray(); - } - - public void Deserialize(BinaryReader binaryReader) - { - binaryReader.ReadValue(out Name); - binaryReader.ReadValue(out id); - binaryReader.ReadValue(out email); - binaryReader.ReadValue(out phone); - } - - public void Deserialize(byte[] data) - { - using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); - Deserialize(binaryReader); - } - } - - public class AddressBook : ProtocolCore.ISerialize, ProtocolCore.IDeserialize - { - public List person; - public List other; - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(person); - binaryWriter.WriteValue(other); - } - - public byte[] Serialize() - { - using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); - Serialize(binaryWriter); - return memoryStream.ToArray(); - } - - public void Deserialize(BinaryReader binaryReader) - { - binaryReader.ReadValue(out person); - binaryReader.ReadValue(out other); - } - - public void Deserialize(byte[] data) - { - using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); - Deserialize(binaryReader); - } - } -} \ No newline at end of file diff --git a/src/writeCs/sample/cs序列化1.jpg b/src/writeCs/sample/cs序列化1.jpg deleted file mode 100644 index 4b56c0675630090ce984a4b7a3363bbe8420161a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78789 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 UhDScw^<~s%KArzoLBII_01jnATL1t6 diff --git a/src/writeCs/sample/cs序列化2.png b/src/writeCs/sample/cs序列化2.png deleted file mode 100644 index b11a219eadba51af2a7b8a483b864bc56813ab41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18265 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 diff --git a/test/protoMsg.cs b/test/protoMsg.cs index 5b2d169..f5537e5 100644 --- a/test/protoMsg.cs +++ b/test/protoMsg.cs @@ -3,6 +3,8 @@ using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; +using MiscUtil.Conversion; +using MiscUtil.IO; namespace GenProto { @@ -10,13 +12,13 @@ namespace GenProto { public interface ISerialize { - void Serialize(BinaryWriter binaryWriter); + void Serialize(EndianBinaryWriter binaryWriter); byte[] Serialize(); } public interface IDeserialize { - void Deserialize(BinaryReader binaryReader); + void Deserialize(EndianBinaryReader binaryReader); void Deserialize(byte[] data); } @@ -57,7 +59,7 @@ namespace GenProto }; } - public static void WriteValue(this BinaryWriter binaryWriter, T value) + public static void WriteValue(this EndianBinaryWriter binaryWriter, T value) { switch (value) { @@ -95,11 +97,13 @@ namespace GenProto binaryWriter.Write(doubleValue); break; case string stringValue: - binaryWriter.Write(stringValue); + var bytesLength = (ushort)binaryWriter.Encoding.GetByteCount(stringValue); + binaryWriter.Write(bytesLength); + var bytes = binaryWriter.Encoding.GetBytes(stringValue); + binaryWriter.Write(bytes); break; default: { - binaryWriter.Write(value != null); switch (value) { case IList listValue: @@ -123,97 +127,86 @@ namespace GenProto } - public static void WriteList(this BinaryWriter binaryWriter, IList list) + public static void WriteList(this EndianBinaryWriter binaryWriter, IList list) { - var length = (ushort) (list?.Count ?? 0); + var length = (ushort)(list?.Count ?? 0); binaryWriter.Write(length); if (list == null) return; for (var idx = 0; idx < length; idx++) { var value = list[idx]; - - if (idx == 0) - { - var basicType = JudgeType(value); - binaryWriter.Write((byte) basicType); - } - binaryWriter.WriteValue(value); } } - public static void ReadValue(this BinaryReader binaryReader, out bool value) + public static void ReadValue(this EndianBinaryReader binaryReader, out bool value) { value = binaryReader.ReadBoolean(); } - public static void ReadValue(this BinaryReader binaryReader, out sbyte value) + public static void ReadValue(this EndianBinaryReader binaryReader, out sbyte value) { value = binaryReader.ReadSByte(); } - public static void ReadValue(this BinaryReader binaryReader, out byte value) + public static void ReadValue(this EndianBinaryReader binaryReader, out byte value) { value = binaryReader.ReadByte(); } - public static void ReadValue(this BinaryReader binaryReader, out ushort value) + public static void ReadValue(this EndianBinaryReader binaryReader, out ushort value) { value = binaryReader.ReadUInt16(); } - public static void ReadValue(this BinaryReader binaryReader, out short value) + public static void ReadValue(this EndianBinaryReader binaryReader, out short value) { value = binaryReader.ReadInt16(); } - public static void ReadValue(this BinaryReader binaryReader, out int value) + public static void ReadValue(this EndianBinaryReader binaryReader, out int value) { value = binaryReader.ReadInt32(); } - public static void ReadValue(this BinaryReader binaryReader, out uint value) + public static void ReadValue(this EndianBinaryReader binaryReader, out uint value) { value = binaryReader.ReadUInt32(); } - public static void ReadValue(this BinaryReader binaryReader, out long value) + public static void ReadValue(this EndianBinaryReader binaryReader, out long value) { value = binaryReader.ReadInt64(); } - public static void ReadValue(this BinaryReader binaryReader, out ulong value) + public static void ReadValue(this EndianBinaryReader binaryReader, out ulong value) { value = binaryReader.ReadUInt64(); } - public static void ReadValue(this BinaryReader binaryReader, out float value) + public static void ReadValue(this EndianBinaryReader binaryReader, out float value) { value = binaryReader.ReadSingle(); } - public static void ReadValue(this BinaryReader binaryReader, out double value) + public static void ReadValue(this EndianBinaryReader binaryReader, out double value) { value = binaryReader.ReadDouble(); } - public static void ReadValue(this BinaryReader binaryReader, out string value) + public static void ReadValue(this EndianBinaryReader binaryReader, out string value) { - value = binaryReader.ReadString(); + var bytesLength = binaryReader.ReadUInt16(); + var bytes = binaryReader.ReadBytes(bytesLength); + value = binaryReader.Encoding.GetString(bytes, 0, bytes.Length); } - public static void ReadValue(this BinaryReader binaryReader, out T value) where T : new() + public static void ReadValue(this EndianBinaryReader binaryReader, out T value) where T : new() { value = default; - var haveValue = binaryReader.ReadBoolean(); - if (!haveValue) - { - return; - } - value = new T(); - if (!(value is IDeserialize deserialize)) + if (value is not IDeserialize deserialize) { throw new InvalidOperationException($"error type: {typeof(T).FullName}"); } @@ -221,15 +214,10 @@ namespace GenProto deserialize.Deserialize(binaryReader); } - public static void ReadValue(this BinaryReader binaryReader, out List outList) where T : new() + public static void ReadValue(this EndianBinaryReader binaryReader, out List outList, BasicTypeEnum basicTypeEnum) where T : new() { outList = default; IList list = default; - var haveValue = binaryReader.ReadBoolean(); - if (!haveValue) - { - return; - } var length = binaryReader.ReadUInt16(); if (length <= 0) @@ -237,7 +225,6 @@ namespace GenProto return; } - var basicTypeEnum = (BasicTypeEnum) binaryReader.ReadByte(); for (var idx = 0; idx < length; idx++) { switch (basicTypeEnum) @@ -304,19 +291,12 @@ namespace GenProto break; case BasicTypeEnum.Custom: list ??= new List(length); - var state = binaryReader.ReadBoolean(); - if (state) - { - if (new T() is IDeserialize item) + if (new T() is IDeserialize item) { item.Deserialize(binaryReader); list.Add(item); } - } - break; - - default: throw new InvalidOperationException(); } @@ -332,7 +312,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -340,10 +320,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(aa); } @@ -361,7 +341,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -369,17 +349,28 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(number); + public void Serialize(EndianBinaryWriter binaryWriter) + { + if (number != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(number); + } + else + { + binaryWriter.WriteValue(0); + } binaryWriter.WriteValue(type); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out number); + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out number); + } binaryReader.ReadValue(out type); } } @@ -394,7 +385,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -402,10 +393,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(name); binaryWriter.WriteValue(id); @@ -417,7 +408,7 @@ namespace GenProto binaryReader.ReadValue(out name); binaryReader.ReadValue(out id); binaryReader.ReadValue(out email); - binaryReader.ReadValue(out phone); + binaryReader.ReadValue(out phone, 0x00); } } public class addressBook : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -429,7 +420,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -437,18 +428,18 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(person); binaryWriter.WriteValue(other); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out person); - binaryReader.ReadValue(out other); + binaryReader.ReadValue(out person, 0x00); + binaryReader.ReadValue(out other, 0x00); } } public class union : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -460,7 +451,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -468,10 +459,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(test); binaryWriter.WriteValue(type); @@ -490,7 +481,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -498,10 +489,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(bool); } @@ -519,7 +510,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -527,10 +518,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -550,7 +541,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -558,10 +549,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -581,7 +572,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -589,10 +580,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -612,7 +603,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -620,10 +611,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -651,7 +642,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -659,10 +650,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -698,7 +689,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -706,10 +697,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -729,7 +720,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -737,10 +728,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -760,7 +751,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -768,10 +759,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -797,7 +788,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -805,30 +796,118 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(int1); - binaryWriter.WriteValue(int2); - binaryWriter.WriteValue(int3); - binaryWriter.WriteValue(int4); - binaryWriter.WriteValue(int5); - binaryWriter.WriteValue(int6); - binaryWriter.WriteValue(int7); - binaryWriter.WriteValue(int8); + public void Serialize(EndianBinaryWriter binaryWriter) + { + if (int1 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int1); + } + else + { + binaryWriter.WriteValue(0); + } + if (int2 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int2); + } + else + { + binaryWriter.WriteValue(0); + } + if (int3 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int3); + } + else + { + binaryWriter.WriteValue(0); + } + if (int4 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int4); + } + else + { + binaryWriter.WriteValue(0); + } + if (int5 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int5); + } + else + { + binaryWriter.WriteValue(0); + } + if (int6 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int6); + } + else + { + binaryWriter.WriteValue(0); + } + if (int7 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int7); + } + else + { + binaryWriter.WriteValue(0); + } + if (int8 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int8); + } + else + { + binaryWriter.WriteValue(0); + } } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); - binaryReader.ReadValue(out int2); - binaryReader.ReadValue(out int3); - binaryReader.ReadValue(out int4); - binaryReader.ReadValue(out int5); - binaryReader.ReadValue(out int6); - binaryReader.ReadValue(out int7); - binaryReader.ReadValue(out int8); + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int1); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int2); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int3); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int4); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int5); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int6); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int7); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int8); + } } } public class tnumber : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -848,7 +927,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -856,34 +935,144 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) - { - binaryWriter.WriteValue(int1); - binaryWriter.WriteValue(int2); - binaryWriter.WriteValue(int3); - binaryWriter.WriteValue(int4); - binaryWriter.WriteValue(int5); - binaryWriter.WriteValue(int6); - binaryWriter.WriteValue(int7); - binaryWriter.WriteValue(int8); - binaryWriter.WriteValue(float1); - binaryWriter.WriteValue(float2); + public void Serialize(EndianBinaryWriter binaryWriter) + { + if (int1 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int1); + } + else + { + binaryWriter.WriteValue(0); + } + if (int2 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int2); + } + else + { + binaryWriter.WriteValue(0); + } + if (int3 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int3); + } + else + { + binaryWriter.WriteValue(0); + } + if (int4 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int4); + } + else + { + binaryWriter.WriteValue(0); + } + if (int5 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int5); + } + else + { + binaryWriter.WriteValue(0); + } + if (int6 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int6); + } + else + { + binaryWriter.WriteValue(0); + } + if (int7 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int7); + } + else + { + binaryWriter.WriteValue(0); + } + if (int8 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(int8); + } + else + { + binaryWriter.WriteValue(0); + } + if (float1 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(float1); + } + else + { + binaryWriter.WriteValue(0); + } + if (float2 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(float2); + } + else + { + binaryWriter.WriteValue(0); + } } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); - binaryReader.ReadValue(out int2); - binaryReader.ReadValue(out int3); - binaryReader.ReadValue(out int4); - binaryReader.ReadValue(out int5); - binaryReader.ReadValue(out int6); - binaryReader.ReadValue(out int7); - binaryReader.ReadValue(out int8); - binaryReader.ReadValue(out float1); - binaryReader.ReadValue(out float2); + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int1); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int2); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int3); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int4); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int5); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int6); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int7); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out int8); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out float1); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out float2); + } } } public class tfloat : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -895,7 +1084,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -903,10 +1092,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -926,7 +1115,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -934,10 +1123,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -957,7 +1146,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -965,10 +1154,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); binaryWriter.WriteValue(int2); @@ -987,7 +1176,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -995,16 +1184,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x01); } } public class tlistint8 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1015,7 +1204,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1023,16 +1212,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x02); } } public class tlistuint8 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1043,7 +1232,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1051,16 +1240,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x03); } } public class tlistint16 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1071,7 +1260,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1079,16 +1268,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x04); } } public class tlistuint16 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1099,7 +1288,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1107,16 +1296,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x05); } } public class tlistint32 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1127,7 +1316,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1135,16 +1324,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x06); } } public class tlistuint32 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1155,7 +1344,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1163,16 +1352,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x07); } } public class tlistint64 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1183,7 +1372,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1191,16 +1380,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x08); } } public class tlistuint64 : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1211,7 +1400,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1219,16 +1408,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x09); } } public class tlistinteger : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1239,7 +1428,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1247,16 +1436,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x00); } } public class tlistnumber : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1267,7 +1456,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1275,16 +1464,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x00); } } public class tlistfloat : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1295,7 +1484,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1303,16 +1492,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x10); } } public class tlistdouble : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1323,7 +1512,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1331,16 +1520,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x11); } } public class tliststring : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1351,7 +1540,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1359,16 +1548,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x12); } } public class tlistunion : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1379,7 +1568,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1387,16 +1576,16 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(int1); } public void Deserialize(BinaryReader binaryReader) { - binaryReader.ReadValue(out int1); + binaryReader.ReadValue(out int1, 0x00); } } public class allType : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1461,7 +1650,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1469,10 +1658,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(bool); binaryWriter.WriteValue(int8); @@ -1483,29 +1672,181 @@ namespace GenProto binaryWriter.WriteValue(uint32); binaryWriter.WriteValue(int64); binaryWriter.WriteValue(uint64); - binaryWriter.WriteValue(inte8); - binaryWriter.WriteValue(uinte8); - binaryWriter.WriteValue(inte16); - binaryWriter.WriteValue(uinte16); - binaryWriter.WriteValue(inte32); - binaryWriter.WriteValue(uinte32); - binaryWriter.WriteValue(inte64); - binaryWriter.WriteValue(uinte64); - binaryWriter.WriteValue(num8); - binaryWriter.WriteValue(unum8); - binaryWriter.WriteValue(num16); - binaryWriter.WriteValue(unum16); - binaryWriter.WriteValue(num32); - binaryWriter.WriteValue(unum32); - binaryWriter.WriteValue(num64); - binaryWriter.WriteValue(unum64); - binaryWriter.WriteValue(numfloat); - binaryWriter.WriteValue(numdouble); + if (inte8 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(inte8); + } + else + { + binaryWriter.WriteValue(0); + } + if (uinte8 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(uinte8); + } + else + { + binaryWriter.WriteValue(0); + } + if (inte16 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(inte16); + } + else + { + binaryWriter.WriteValue(0); + } + if (uinte16 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(uinte16); + } + else + { + binaryWriter.WriteValue(0); + } + if (inte32 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(inte32); + } + else + { + binaryWriter.WriteValue(0); + } + if (uinte32 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(uinte32); + } + else + { + binaryWriter.WriteValue(0); + } + if (inte64 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(inte64); + } + else + { + binaryWriter.WriteValue(0); + } + if (uinte64 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(uinte64); + } + else + { + binaryWriter.WriteValue(0); + } + if (num8 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(num8); + } + else + { + binaryWriter.WriteValue(0); + } + if (unum8 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(unum8); + } + else + { + binaryWriter.WriteValue(0); + } + if (num16 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(num16); + } + else + { + binaryWriter.WriteValue(0); + } + if (unum16 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(unum16); + } + else + { + binaryWriter.WriteValue(0); + } + if (num32 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(num32); + } + else + { + binaryWriter.WriteValue(0); + } + if (unum32 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(unum32); + } + else + { + binaryWriter.WriteValue(0); + } + if (num64 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(num64); + } + else + { + binaryWriter.WriteValue(0); + } + if (unum64 != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(unum64); + } + else + { + binaryWriter.WriteValue(0); + } + if (numfloat != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(numfloat); + } + else + { + binaryWriter.WriteValue(0); + } + if (numdouble != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(numdouble); + } + else + { + binaryWriter.WriteValue(0); + } binaryWriter.WriteValue(float); binaryWriter.WriteValue(double); binaryWriter.WriteValue(string1); binaryWriter.WriteValue(string2); - binaryWriter.WriteValue(union); + if (union != null) + { + binaryWriter.WriteValue(1); + binaryWriter.WriteValue(union); + } + else + { + binaryWriter.WriteValue(0); + } binaryWriter.WriteValue(lbool); binaryWriter.WriteValue(lint8); binaryWriter.WriteValue(luint8); @@ -1541,52 +1882,109 @@ namespace GenProto binaryReader.ReadValue(out uint32); binaryReader.ReadValue(out int64); binaryReader.ReadValue(out uint64); - binaryReader.ReadValue(out inte8); - binaryReader.ReadValue(out uinte8); - binaryReader.ReadValue(out inte16); - binaryReader.ReadValue(out uinte16); - binaryReader.ReadValue(out inte32); - binaryReader.ReadValue(out uinte32); - binaryReader.ReadValue(out inte64); - binaryReader.ReadValue(out uinte64); - binaryReader.ReadValue(out num8); - binaryReader.ReadValue(out unum8); - binaryReader.ReadValue(out num16); - binaryReader.ReadValue(out unum16); - binaryReader.ReadValue(out num32); - binaryReader.ReadValue(out unum32); - binaryReader.ReadValue(out num64); - binaryReader.ReadValue(out unum64); - binaryReader.ReadValue(out numfloat); - binaryReader.ReadValue(out numdouble); + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out inte8); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out uinte8); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out inte16); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out uinte16); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out inte32); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out uinte32); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out inte64); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out uinte64); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out num8); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out unum8); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out num16); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out unum16); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out num32); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out unum32); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out num64); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out unum64); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out numfloat); + } + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out numdouble); + } binaryReader.ReadValue(out float); binaryReader.ReadValue(out double); binaryReader.ReadValue(out string1); binaryReader.ReadValue(out string2); - binaryReader.ReadValue(out union); - binaryReader.ReadValue(out lbool); - binaryReader.ReadValue(out lint8); - binaryReader.ReadValue(out luint8); - binaryReader.ReadValue(out lint16); - binaryReader.ReadValue(out luint16); - binaryReader.ReadValue(out lint32); - binaryReader.ReadValue(out luint32); - binaryReader.ReadValue(out lint64); - binaryReader.ReadValue(out luint64); - binaryReader.ReadValue(out linte8); - binaryReader.ReadValue(out linte16); - binaryReader.ReadValue(out linte32); - binaryReader.ReadValue(out linte64); - binaryReader.ReadValue(out lnum8); - binaryReader.ReadValue(out lnum16); - binaryReader.ReadValue(out lnum32); - binaryReader.ReadValue(out lnum64); - binaryReader.ReadValue(out lnfloat32); - binaryReader.ReadValue(out lnfloat64); - binaryReader.ReadValue(out lfloat); - binaryReader.ReadValue(out ldouble); - binaryReader.ReadValue(out lstring); - binaryReader.ReadValue(out lunion); + if (binaryReader.ReadBoolean()) + { + binaryReader.ReadValue(out union); + } + binaryReader.ReadValue(out lbool, 0x01); + binaryReader.ReadValue(out lint8, 0x02); + binaryReader.ReadValue(out luint8, 0x03); + binaryReader.ReadValue(out lint16, 0x04); + binaryReader.ReadValue(out luint16, 0x05); + binaryReader.ReadValue(out lint32, 0x06); + binaryReader.ReadValue(out luint32, 0x07); + binaryReader.ReadValue(out lint64, 0x08); + binaryReader.ReadValue(out luint64, 0x09); + binaryReader.ReadValue(out linte8, 0x00); + binaryReader.ReadValue(out linte16, 0x00); + binaryReader.ReadValue(out linte32, 0x00); + binaryReader.ReadValue(out linte64, 0x00); + binaryReader.ReadValue(out lnum8, 0x00); + binaryReader.ReadValue(out lnum16, 0x00); + binaryReader.ReadValue(out lnum32, 0x00); + binaryReader.ReadValue(out lnum64, 0x00); + binaryReader.ReadValue(out lnfloat32, 0x00); + binaryReader.ReadValue(out lnfloat64, 0x00); + binaryReader.ReadValue(out lfloat, 0x10); + binaryReader.ReadValue(out ldouble, 0x11); + binaryReader.ReadValue(out lstring, 0x12); + binaryReader.ReadValue(out lunion, 0x00); } } public class testnull : ProtocolCore.ISerialize, ProtocolCore.IDeserialize @@ -1596,7 +1994,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1604,10 +2002,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { } public void Deserialize(BinaryReader binaryReader) @@ -1625,7 +2023,7 @@ namespace GenProto public byte[] Serialize() { using var memoryStream = new MemoryStream(); - using var binaryWriter = new BinaryWriter(memoryStream); + using var binaryWriter = new EndianBinaryWriter(EndianBitConverter.Big, memoryStream); Serialize(binaryWriter); return memoryStream.ToArray(); } @@ -1633,10 +2031,10 @@ namespace GenProto public void Deserialize(byte[] data) { using var memoryStream = new MemoryStream(data); - using var binaryReader = new BinaryReader(memoryStream); + using var binaryReader = new EndianBinaryReader(EndianBitConverter.Big, memoryStream); Deserialize(binaryReader); } - public void Serialize(BinaryWriter binaryWriter) + public void Serialize(EndianBinaryWriter binaryWriter) { binaryWriter.WriteValue(name); binaryWriter.WriteValue(id); @@ -1648,7 +2046,7 @@ namespace GenProto binaryReader.ReadValue(out name); binaryReader.ReadValue(out id); binaryReader.ReadValue(out email); - binaryReader.ReadValue(out phone); + binaryReader.ReadValue(out phone, 0x00); } } } \ No newline at end of file