/// <summary> /// Generates code for writing a class/message /// </summary> static void GenerateWriter(ProtoMessage m, CodeWriter cw, Options options) { string stack = "global::SilentOrbit.ProtocolBuffers.ProtocolParser.Stack"; if (options.ExperimentalStack != null) { cw.WriteLine("[ThreadStatic]"); cw.WriteLine("static global::SilentOrbit.ProtocolBuffers.MemoryStreamStack stack = new " + options.ExperimentalStack + "();"); stack = "stack"; } cw.Summary("Serialize the instance into the stream"); cw.Bracket(m.OptionAccess + " static void Serialize(Stream stream, " + m.CsType + " instance)"); if (m.OptionTriggers) { cw.WriteLine("instance.BeforeSerialize();"); cw.WriteLine(); } if (m.IsUsingBinaryWriter) { cw.WriteLine("BinaryWriter bw = new BinaryWriter(stream);"); } //Shared memorystream for all fields cw.WriteLine("var msField = " + stack + ".Pop();"); foreach (Field f in m.Fields.Values) { FieldSerializer.FieldWriter(m, f, cw); } cw.WriteLine(stack + ".Push(msField);"); if (m.OptionPreserveUnknown) { cw.IfBracket("instance.PreservedFields != null"); cw.ForeachBracket("var kv in instance.PreservedFields"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteKey(stream, kv.Key);"); cw.WriteLine("stream.Write(kv.Value, 0, kv.Value.Length);"); cw.EndBracket(); cw.EndBracket(); } cw.EndBracket(); cw.WriteLine(); cw.Summary("Helper: Serialize into a MemoryStream and return its byte array"); cw.Bracket(m.OptionAccess + " static byte[] SerializeToBytes(" + m.CsType + " instance)"); cw.Using("var ms = new MemoryStream()"); cw.WriteLine("Serialize(ms, instance);"); cw.WriteLine("return ms.ToArray();"); cw.EndBracket(); cw.EndBracket(); cw.Summary("Helper: Serialize with a varint length prefix"); cw.Bracket(m.OptionAccess + " static void SerializeLengthDelimited(Stream stream, " + m.CsType + " instance)"); cw.WriteLine("var data = SerializeToBytes(instance);"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteUInt32(stream, (uint)data.Length);"); cw.WriteLine("stream.Write(data, 0, data.Length);"); cw.EndBracket(); }
/// <summary> /// Generates code for writing a class/message /// </summary> static void GenerateWriter(ProtoMessage m, CodeWriter cw) { cw.Summary("Serialize the instance into the stream"); cw.Bracket(m.OptionAccess + " static void Serialize(CitoStream stream, " + m.FullCsType + " instance)"); if (m.OptionTriggers) { cw.WriteLine("instance.BeforeSerialize();"); cw.WriteLine(); } if (m.IsUsingBinaryWriter) { cw.WriteLine("BinaryWriter bw = new BinaryWriter(stream);"); } foreach (Field f in m.Fields.Values) { FieldSerializer.FieldWriter(m, f, cw); } if (m.OptionPreserveUnknown) { cw.IfBracket("instance.PreservedFields != null"); cw.ForeachBracket("var kv in instance.PreservedFields"); cw.WriteLine("ProtocolParser.WriteKey(stream, kv.Key);"); cw.WriteLine("stream.Write(kv.Value, 0, kv.Value.Length);"); cw.EndBracket(); cw.EndBracket(); } cw.EndBracket(); cw.WriteLine(); cw.Summary("Helper: Serialize into a MemoryStream and return its byte array"); cw.Bracket(m.OptionAccess + " static byte[] SerializeToBytes(" + m.FullCsType + " instance)"); cw.WriteLine("CitoMemoryStream ms = new CitoMemoryStream();"); cw.WriteLine("Serialize(ms, instance);"); cw.WriteLine("return ms.ToArray();"); //cw.EndBracket(); cw.EndBracket(); cw.Summary("Helper: Serialize with a varint length prefix"); cw.Bracket(m.OptionAccess + " static void SerializeLengthDelimited(CitoStream stream, " + m.FullCsType + " instance)"); cw.WriteLine("byte[] data = SerializeToBytes(instance);"); cw.WriteLine("ProtocolParser.WriteUInt32_(stream, ProtoPlatform.ArrayLength(data));"); cw.WriteLine("stream.Write(data, 0, ProtoPlatform.ArrayLength(data));"); cw.EndBracket(); }
/// <summary> /// Generates code for writing a class/message /// </summary> static void GenerateWriter(ProtoMessage m, CodeWriter cw) { cw.Summary("Serialize the instance into the stream"); cw.Bracket(m.OptionAccess + " static void Serialize(Stream stream, " + m.CsType + " instance)"); if (m.OptionTriggers) { cw.WriteLine("instance.BeforeSerialize();"); cw.WriteLine(); } if (m.IsUsingBinaryWriter) { cw.WriteLine("BinaryWriter bw = new BinaryWriter(stream);"); } foreach (Field f in m.Fields.Values) { FieldSerializer.FieldWriter(m, f, cw); } if (m.OptionPreserveUnknown) { cw.IfBracket("instance.PreservedFields != null"); cw.ForeachBracket("var kv in instance.PreservedFields"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteKey(stream, kv.Key);"); cw.WriteLine("stream.Write(kv.Value, 0, kv.Value.Length);"); cw.EndBracket(); cw.EndBracket(); } cw.EndBracket(); cw.WriteLine(); cw.Summary("Helper: Serialize into a MemoryStream and return its byte array"); cw.Bracket(m.OptionAccess + " static byte[] SerializeToBytes(" + m.CsType + " instance)"); cw.Using("var ms = new MemoryStream()"); cw.WriteLine("Serialize(ms, instance);"); cw.WriteLine("return ms.ToArray();"); cw.EndBracket(); cw.EndBracket(); }
/// <summary> /// Generates code for writing a class/message /// </summary> static void GenerateWriter(ProtoMessage m, CodeWriter cw, Options options) { cw.WriteLine("#region [Methods] Writer"); #region [Method] Serialize cw.Summary("Serialize the instance into the stream"); cw.Bracket(m.OptionAccess + " static void Serialize(Stream stream, " + m.CsType + " instance)"); { if (m.OptionTriggers) { cw.WriteLine("instance.BeforeSerialize();"); cw.WriteLine(); } //Shared memorystream for all fields cw.WriteLine("var msField = Pool.Get<MemoryStream>();"); foreach (Field f in m.Fields.Values) { FieldSerializer.FieldWriter(m, f, cw, false); } cw.WriteLine("Pool.FreeMemoryStream(ref msField);"); if (m.OptionPreserveUnknown) { cw.IfBracket("instance.PreservedFields != null"); cw.ForeachBracket("var kv in instance.PreservedFields"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteKey(stream, kv.Key);"); cw.WriteLine("stream.Write(kv.Value, 0, kv.Value.Length);"); cw.EndBracket(); cw.EndBracket(); } } cw.EndBracketSpace(); #endregion #region [Method] SerializeToBytes cw.Summary("Helper: Serialize into a MemoryStream and return its byte array"); cw.Bracket(m.OptionAccess + " static byte[] SerializeToBytes(" + m.CsType + " instance)"); { cw.WriteLine("var ms = Pool.Get<MemoryStream>();"); cw.WriteLine("Serialize(ms, instance);"); cw.WriteLine("var arr = ms.ToArray();"); cw.WriteLine("Pool.FreeMemoryStream(ref ms);"); cw.WriteLine("return arr;"); } cw.EndBracket(); #endregion #region [Method] SerializeLengthDelimited cw.Summary("Helper: Serialize with a varint length prefix"); cw.Bracket(m.OptionAccess + " static void SerializeLengthDelimited(Stream stream, " + m.CsType + " instance)"); { cw.WriteLine("var data = SerializeToBytes(instance);"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteUInt32(stream, (uint)data.Length);"); cw.WriteLine("stream.Write(data, 0, data.Length);"); } cw.EndBracketSpace(); #endregion #region [Method] SerializeDelta cw.Bracket($"public static void SerializeDelta(Stream stream, {m.CsType} instance, {m.CsType} previous)"); { cw.WriteLine("var msField = Pool.Get<MemoryStream>();"); foreach (Field f in m.Fields.Values) { cw.IfBracket($"instance.{f.CsName} != previous.{f.CsName}"); FieldSerializer.FieldWriter(m, f, cw, true); cw.EndBracket(); } cw.WriteLine("Pool.FreeMemoryStream(ref msField);"); } cw.EndBracket(); #endregion #region [Method] WriteToStream if (m.OptionExternal == false) { cw.Bracket("public void WriteToStream(Stream stream)"); { cw.WriteLine("Serialize(stream, this);"); } cw.EndBracket(); } #endregion #region [Method] WriteToStreamDelta if (m.OptionExternal == false) { cw.Bracket($"public void WriteToStreamDelta(Stream stream, {m.CsType} previous)"); { cw.IfBracket("previous != null"); { cw.WriteLine("SerializeDelta(stream, this, previous);"); } cw.EndBracket(); cw.Bracket("else"); { cw.WriteLine("Serialize(stream, this);"); } cw.EndBracket(); } cw.EndBracket(); } #endregion cw.WriteLine("#endregion"); }
/// <summary> /// Generates code for writing a class/message /// </summary> void GenerateWriter(ProtoMessage m) { string mTableParamDefs, mTableParams; FindMessageTableParams(m, out mTableParamDefs, out mTableParams); string stack = "global::SilentOrbit.ProtocolBuffers.ProtocolParser.Stack"; if (options.ExperimentalStack != null) { cw.WriteLine("[ThreadStatic]"); cw.WriteLine("static global::SilentOrbit.ProtocolBuffers.MemoryStreamStack stack = new " + options.ExperimentalStack + "();"); stack = "stack"; } cw.Summary("Serialize the instance into the stream"); cw.Bracket(m.OptionAccess + " static void Serialize(Stream stream, " + m.CsType + " instance" + mTableParamDefs + ")"); if (m.OptionTriggers) { cw.WriteLine("instance.BeforeSerialize();"); cw.WriteLine(); } if (m.IsUsingBinaryWriter) { cw.WriteLine("BinaryWriter bw = new BinaryWriter(stream);"); } //Shared memorystream for all fields cw.WriteLine("var msField = " + stack + ".Pop();"); foreach (Field f in m.Fields.Values) { FieldSerializer.FieldWriter(m, f, cw, options); } cw.WriteLine(stack + ".Push(msField);"); if (m.OptionPreserveUnknown) { cw.IfBracket("instance.PreservedFields != null"); cw.ForeachBracket("var kv in instance.PreservedFields"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteKey(stream, kv.Key);"); cw.WriteLine("stream.Write(kv.Value, 0, kv.Value.Length);"); cw.EndBracket(); cw.EndBracket(); } cw.EndBracket(); cw.WriteLine(); if (m.OptionType != "interface" && !m.OptionNoPartials) { cw.Summary("Serialize and return data as a byte array (use this sparingly)"); cw.Bracket(m.OptionAccess + " byte[] ToProtoBytes(" + mTableParamDefs.TrimStart(',', ' ') + ")"); cw.WriteLine("return SerializeToBytes( this" + mTableParams + " );"); cw.EndBracketSpace(); cw.Summary("Serialize to a Stream"); cw.Bracket(m.OptionAccess + " void ToProto( Stream stream" + mTableParamDefs + " )"); cw.WriteLine("Serialize( stream, this" + mTableParams + " );"); cw.EndBracketSpace(); cw.Summary("Serialize to a JSON string"); cw.Bracket(m.OptionAccess + " string ToJson(" + mTableParamDefs.TrimStart(',', ' ') + ")"); cw.WriteLine("var writer = new global::System.IO.StringWriter();"); cw.WriteLine("SerializeJson(writer, this" + mTableParams + ");"); cw.WriteLine("return writer.ToString();"); cw.EndBracketSpace(); } cw.Summary("Helper: Serialize into a MemoryStream and return its byte array"); cw.Bracket(m.OptionAccess + " static byte[] SerializeToBytes(" + m.CsType + " instance" + mTableParamDefs + ")"); cw.Using("var ms = new MemoryStream()"); cw.WriteLine("Serialize(ms, instance" + mTableParams + ");"); cw.WriteLine("return ms.ToArray();"); cw.EndBracket(); cw.EndBracket(); cw.Summary("Helper: Serialize with a varint length prefix"); cw.Bracket(m.OptionAccess + " static void SerializeLengthDelimited(Stream stream, " + m.CsType + " instance" + mTableParamDefs + ")"); cw.WriteLine("var data = SerializeToBytes(instance" + mTableParams + ");"); cw.WriteLine("global::SilentOrbit.ProtocolBuffers.ProtocolParser.WriteUInt32(stream, (uint)data.Length);"); cw.WriteLine("stream.Write(data, 0, data.Length);"); cw.EndBracket(); cw.Summary("Serialize into a JSON string"); cw.Bracket(m.OptionAccess + " static void SerializeJson(TextWriter writer, " + m.CsType + " instance" + mTableParamDefs + ")"); cw.WriteLine("writer.Write(\"{\");"); var first = true; foreach (Field f in m.Fields.Values) { if (!first) { cw.WriteLine("writer.Write(\",\");"); } else { first = false; } FieldSerializer.FieldJsonWriter(m, f, cw, options); } cw.WriteLine("writer.Write(\"}\");"); cw.EndBracket(); }