示例#1
0
        protected virtual void VisitHeader(TypeNode node, string nameSpace, TextBuilder builder)
        {
            builder.WriteLine("// Auto generated code");
            builder.WriteLine("using Kernel;");
            builder.WriteLine("using Kernel.Config;");
            builder.WriteLine("using Kernel.Util;");
            builder.WriteLine("using System;");
            builder.WriteLine("using System.IO;");
            builder.EmptyLine();

            builder.WriteLine("namespace {0}", nameSpace);
            builder.LeftPar();
            builder.Indent();
            builder.WriteLine("public class {0} : IConfigSerializer", node.SerializerTypeName);
            builder.LeftPar();
            builder.Indent();
        }
示例#2
0
        protected void AppendWritePart(WritePartNode node, TextBuilder builder)
        {
            if (node.FirstChild is ArrayTypeNode)
            {
                VisitWriteArray(VARIABLE, STREAM, node.FirstChild as ArrayTypeNode, builder);
            }
            else if (node.FirstChild is ListTypeNode)
            {
                VisitWriteList(VARIABLE, STREAM, node.FirstChild as ListTypeNode, builder);
            }
            else if (node.FirstChild is DictionaryTypeNode)
            {
                VisitWriteDictionary(VARIABLE, STREAM, node.FirstChild as DictionaryTypeNode, builder);
            }
            else if (node.FirstChild is HashSetTypeNode)
            {
                VisitWriteHashSet(VARIABLE, STREAM, node.FirstChild as HashSetTypeNode, builder);
            }
            else if (node.FirstChild is PolyClassTypeNode)
            {
                VisitWritePolyClass(VARIABLE, STREAM, node.FirstChild as PolyClassTypeNode, builder);
            }
            else if (node.FirstChild is TwoDimArrayTypeNode)
            {
                VisitWriteTwoDimArray(VARIABLE, STREAM, node.FirstChild as TwoDimArrayTypeNode, builder);
            }
            else if (node.FirstChild is StringTypeNode)
            {
                VisitWriteString(VARIABLE, STREAM, builder);
            }
            else
            {
                foreach (var child in node.Children)
                {
                    if (child is FieldNode)
                    {
                        var field = child as FieldNode;
                        builder.Push();
                        VisitField(VARIABLE, field, builder);
                        var variable = builder.Pop();

                        VisitWriteField(variable, STREAM, field.Serialize, builder);
                    }
                }
            }
        }
示例#3
0
        protected virtual void AppendReadAllFields(ReadPartNode node, TextBuilder builder)
        {
            if (node.CreateNew)
            {
                builder.WriteLine("if(d == null) d = new {0}();", node.TypeName);
            }

            foreach (var child in node.Children)
            {
                if (child is FieldNode)
                {
                    var field = child as FieldNode;
                    builder.Push();
                    VisitField("d", field, builder);
                    var variable = builder.Pop();

                    VisitReadField(variable, "o", field.ReadOnly, field.Serialize, builder);
                }
            }
        }
示例#4
0
        public void VisitReadList(string variable, string reader, ListTypeNode node, TextBuilder builder)
        {
            builder.WriteLine("int size = {0}.ReadInt32();", reader);
            builder.WriteLine("if({0} == null) ", variable);
            builder.WriteLine("\t{0} = new {1}(size);", variable, node.TypeName);
            builder.WriteLine("else if({0}.Count != size)", variable);
            builder.WriteLine("\t{0}.Clear();", variable);
            builder.WriteLine("for(int i = 0; i < size; ++i)");
            builder.LeftPar();
            builder.Indent();

            builder.WriteIndents();
            builder.Write("var temp = ", variable);
            VisitDeserialization(string.Format("(d.Count > i ? d[i] : default({0}))", node.ParameterNodes[0].TypeName), reader, node.Serialize, builder);
            builder.Write(";");
            builder.NextLine();

            builder.WriteLine("if(d.Count <= i) d.Add(temp); else d[i] = temp;");

            builder.UnIndent();
            builder.RightPar();
        }
示例#5
0
        protected virtual void VisitReadPart(ReadPartNode node, TextBuilder builder)
        {
            builder.WriteLine("object IConfigSerializer.Read(IBinaryReader reader, object o)");
            builder.LeftPar();
            builder.Indent();
            builder.WriteLine("return Read(reader, ({0})o);", node.TypeName);
            builder.UnIndent();
            builder.RightPar();

            builder.EmptyLine();

            builder.WriteLine("public static {0} Read(IBinaryReader o, {0} d)", node.TypeName);
            builder.LeftPar();
            builder.Indent();

            if (!node.Type.IsValueType)
            {
                builder.WriteLine("if(o.ReadBoolean() == false) return null;");
                builder.EmptyLine();
            }

            var root = node.Parent as RootNode;

            if (root != null && root.CustomSerializeParams != null)
            {
                AppendReadFromCustom("o", root.CustomSerializeParams, builder);
            }
            else
            {
                AppendReadPart(node, builder);
            }

            builder.WriteLine("return d;");

            builder.UnIndent();
            builder.RightPar();
        }
示例#6
0
        protected virtual void VisitWritePart(WritePartNode node, TextBuilder builder)
        {
            builder.WriteLine("void IConfigSerializer.Write(IBinaryWriter writer, object o)");
            builder.LeftPar();
            builder.Indent();
            builder.WriteLine("Write(writer, ({0})o);", node.TypeName);
            builder.UnIndent();
            builder.RightPar();

            builder.EmptyLine();

            builder.WriteLine("public static void Write(IBinaryWriter o, {0} d)", node.TypeName);
            builder.LeftPar();
            builder.Indent();

            if (!node.Type.IsValueType)
            {
                builder.WriteLine("o.Write(d != null);");
                builder.WriteLine("if(d == null) return;");
                builder.EmptyLine();
            }

            var root = node.Parent as RootNode;

            if (root != null && root.CustomSerializeParams != null)
            {
                AppendWriteFromCustom("o", root.CustomSerializeParams, builder);
            }
            else
            {
                AppendWritePart(node, builder);
            }

            builder.UnIndent();
            builder.RightPar();
        }
示例#7
0
        public void VisitWritePolyClass(string variable, string writer, PolyClassTypeNode node, TextBuilder builder)
        {
            builder.WriteLine("Type type = {0}.GetType();", variable);

            var children = node.Children.ToArray();

            for (int index = 0; index < children.Length; index++)
            {
                var n = children[index] as SerializeNode;

                builder.WriteIndents();
                if (index > 0)
                {
                    builder.Write("else ");
                }
                builder.Write("if(type == typeof({0}))", n.TypeName);
                builder.NextLine();

                builder.LeftPar();
                builder.Indent();

                builder.WriteLine("{0}.Write({1});", writer, index + 1);

                builder.WriteIndents();
                VisitSerialization(variable + " as " + n.TypeName, writer, n, builder);
                builder.Write(";");
                builder.NextLine();

                builder.UnIndent();
                builder.RightPar();
            }
            if (children.Length > 0)
            {
                builder.WriteLine("else");
                builder.LeftPar();
                builder.Indent();
                builder.WriteLine("{0}.Write(0);", writer);
                builder.UnIndent();
                builder.RightPar();
            }
        }
示例#8
0
        public void VisitWriteDictionary(string variable, string writer, DictionaryTypeNode node, TextBuilder builder)
        {
            builder.WriteLine("int size = {0}.Count;", variable);
            builder.WriteLine("{0}.Write(size);", writer);
            builder.WriteLine("foreach(var elem in {0})", variable);
            builder.LeftPar();
            builder.Indent();

            builder.WriteIndents();
            VisitSerialization("elem.Key", writer, node.SerializeKey, builder);
            builder.Write(";");
            builder.NextLine();

            builder.WriteIndents();
            VisitSerialization("elem.Value", writer, node.SerializeValue, builder);
            builder.Write(";");
            builder.NextLine();

            builder.UnIndent();
            builder.RightPar();
        }
示例#9
0
        public void VisitWriteList(string variable, string writer, ListTypeNode node, TextBuilder builder)
        {
            builder.WriteLine("int size = {0}.Count;", variable);
            builder.WriteLine("{0}.Write(size);", writer);
            builder.WriteLine("for(int i = 0; i < size; ++i)");
            builder.LeftPar();
            builder.Indent();

            builder.WriteIndents();
            VisitSerialization(variable + "[i]", writer, node.Serialize, builder);
            builder.Write(";");
            builder.NextLine();

            builder.UnIndent();
            builder.RightPar();
        }
示例#10
0
 public void VisitStructDeserialization(string variable, string reader, SerializeNode node, TextBuilder builder)
 {
     builder.Write("{0}.Read({1}, {2})", node.TypeNode.SerializerTypeName, reader, variable);
 }
示例#11
0
 public void VisitNullableSerialization(string variable, string writer, NullableSerializationNode node, TextBuilder builder)
 {
     builder.Write("{0}.Write({1} != null);", writer, variable);
     builder.NextLine();
     builder.WriteIndents();
     builder.Write("if({0} != null) ", variable);
     VisitSerialization(variable + ".Value", writer, node.Serialize, builder);
 }
示例#12
0
 public void VisitDateTimeSerialization(string variable, string writer, TextBuilder builder)
 {
     builder.Write("{0}.Write((long)TimeUtil.LocalDateToCTime({1}))", writer, variable);
 }
示例#13
0
 public virtual void VisitFixedSerialization(string variable, string writer, TextBuilder builder)
 {
     builder.Write("{0}.WriteFixed({1})", writer, variable);
 }
示例#14
0
 public void VisitTimeSpanDeserialization(string reader, SerializeNode node, TextBuilder builder)
 {
     builder.Write("new SerializableTimeSpan({0}.ReadInt64() * TimeSpan.TicksPerSecond)", reader);
 }
示例#15
0
 public void VisitDateTimeDeserialization(string reader, SerializeNode node, TextBuilder builder)
 {
     builder.Write("TimeUtil.CTimeToUtcDate({0}.ReadInt64())", reader);
 }
示例#16
0
        protected void AppendWriteFromCustom(string writer, SerializeNode[] customParams, TextBuilder builder)
        {
            string parameters = "", sep = "";

            for (int i = 0; i < customParams.Length; i++)
            {
                var p = customParams[i];
                builder.WriteLine("{1} data{0};", i, p.TypeName);
                parameters += sep + "out data" + i;
                sep         = ", ";
            }
            builder.WriteLine("d.ToSerializedData({1}, {0});", parameters, writer);
            for (int i = 0; i < customParams.Length; i++)
            {
                var p = customParams[i];
                VisitWriteField("data" + i, writer, p, builder);
            }
        }
示例#17
0
 protected virtual void VisitNullableDeserialization(string variable, string reader, NullableSerializationNode node, TextBuilder builder)
 {
     builder.Write("!{0}.ReadBoolean() ? null : new {1}(", reader, node.TypeName);
     VisitDeserialization(string.Format("default({0})", node.Serialize.TypeName), reader, node.Serialize, builder);
     builder.Write(")");
 }
示例#18
0
 protected virtual void VisitClassDeserialization(string variable, string reader, SerializeNode node, TextBuilder builder)
 {
     builder.Write("{0}.Read({1}, {3} as {2})", node.TypeNode.SerializerTypeName, reader, node.TypeName, variable);
 }
示例#19
0
        public void VisitSerialization(string variable, string writer, SerializeNode node, TextBuilder builder)
        {
            switch (node.Category)
            {
            case SerializeNode.NodeCategory.PRIMITIVE:
                VisitPrimitiveSerialization(variable, writer, builder);
                break;

            case SerializeNode.NodeCategory.ENUM:
                VisitEnumSerialization(variable, writer, builder);
                break;

            case SerializeNode.NodeCategory.TIMESPAN:
                VisitTimeSpanSerialization(variable, writer, builder);
                break;

            case SerializeNode.NodeCategory.DATETIME:
                VisitDateTimeSerialization(variable, writer, builder);
                break;

            case SerializeNode.NodeCategory.COLOR:
                VisitColorSerialization(variable, writer, builder);
                break;

            case SerializeNode.NodeCategory.NULLABLE:
                VisitNullableSerialization(variable, writer, node as NullableSerializationNode, builder);
                break;

            case SerializeNode.NodeCategory.POLY_CLASS:
            case SerializeNode.NodeCategory.CLASS:
            case SerializeNode.NodeCategory.ARRAY:
            case SerializeNode.NodeCategory.LIST:
            case SerializeNode.NodeCategory.DICTIONARY:
            case SerializeNode.NodeCategory.STRUCT:
                VisitClassSerialization(variable, writer, node, builder);
                break;
            }
        }
示例#20
0
        public void VisitWriteField(string variable, string writer, SerializeNode node, TextBuilder builder)
        {
            if (node == null)
            {
                return;
            }

            builder.WriteIndents();
            if (node.Category == SerializeNode.NodeCategory.LOCALE)
            {
                builder.Write("StringSerializer.Write({0}, {1}.ToString());", writer, variable);
            }
            else
            {
                VisitSerialization(variable, writer, node, builder);
                builder.Write(";");
            }
            builder.NextLine();
        }
示例#21
0
 public void VisitPrimitiveSerialization(string variable, string writer, TextBuilder builder)
 {
     builder.Write("{0}.Write({1})", writer, variable);
 }
示例#22
0
 public void VisitClassSerialization(string variable, string writer, SerializeNode node, TextBuilder builder)
 {
     builder.Write("{0}.Write({1}, {2})", node.TypeNode.SerializerTypeName, writer, variable);
 }
示例#23
0
 public void VisitTimeSpanSerialization(string variable, string writer, TextBuilder builder)
 {
     builder.Write("{0}.Write({1}.Ticks / TimeSpan.TicksPerSecond)", writer, variable);
 }
示例#24
0
 public virtual void VisitFixedDeserialization(string reader, SerializeNode node, TextBuilder builder)
 {
     builder.Write("{0}.ReadFixed()", reader);
 }
示例#25
0
 public void VisitColorSerialization(string variable, string writer, TextBuilder builder)
 {
     builder.Write("{0}.Write((uint){1})", writer, variable);
 }
示例#26
0
        public void VisitWriteTwoDimArray(string variable, string writer, TwoDimArrayTypeNode node, TextBuilder builder)
        {
            builder.WriteLine("int size0 = {0}.Length;", variable);
            builder.WriteLine("{0}.Write(size0);", writer);
            builder.WriteLine("for(int i = 0; i < size0; ++i)");
            builder.LeftPar();
            builder.Indent();

            builder.WriteLine("int size1 = {0}[i] != null ? {0}[i].Count : 0;", variable);
            builder.WriteLine("{0}.Write(size1);", writer);
            builder.WriteLine("for(int j = 0; j < size1; ++j)");
            builder.LeftPar();
            builder.Indent();

            builder.WriteIndents();
            VisitSerialization(variable + "[i, j]", writer, node.Serialize, builder);
            builder.Write(";");
            builder.NextLine();

            builder.UnIndent();
            builder.RightPar();
            builder.UnIndent();
            builder.RightPar();
        }
示例#27
0
 public void VisitWriteString(string variable, string writer, TextBuilder builder)
 {
     builder.WriteLine("{0}.Write({1});", writer, variable);
 }
示例#28
0
 public void VisitColorDeserialization(string reader, SerializeNode node, TextBuilder builder)
 {
     builder.Write("(Kernel.Engine.Color){0}.ReadUInt32()", reader);
 }
示例#29
0
 public void VisitField(string variable, FieldNode node, TextBuilder builder)
 {
     builder.Write(variable);
     builder.Write(".");
     builder.Write(node.FieldName);
 }
示例#30
0
        public void VisitWriteArray(string variable, string writer, ArrayTypeNode node, TextBuilder builder)
        {
            builder.WriteLine("int size = {0}.Length;", variable);
            builder.WriteLine("{0}.Write(size);", writer);
            builder.WriteLine("for(int i = 0; i < size; ++i)");
            builder.LeftPar();
            builder.Indent();

            VisitWriteField(variable + "[i]", writer, node.Serialize, builder);

            builder.UnIndent();
            builder.RightPar();
        }