示例#1
0
        public void VisitRoot(RootNode node, string nameSpace, TextBuilder builder)
        {
            VisitHeader(node.Header, nameSpace, builder);

            VisitReadPart(node.ReadPart, builder);

            builder.EmptyLine();

            VisitWritePart(node.WritePart, builder);

            FinishVisitHeader(node.Header, builder);
        }
示例#2
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();
        }
示例#3
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();
        }
示例#4
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();
        }
        public void Export(SerializationGenerator generator, string nameSpace, string md5, string targetFolder)
        {
            var builder = new TextBuilder();

            builder.WriteLine("using System;");
            builder.WriteLine("using System.Collections.Generic;");
            builder.WriteLine("using System.IO;");
            builder.WriteLine("using Kernel;");
            builder.WriteLine("using Kernel.Config;");
            builder.EmptyLine();

            builder.WriteLine("namespace {0}", nameSpace);
            builder.LeftPar();
            builder.Indent();

            builder.WriteLine("public partial class ConfigSerializer : ConfigSerializerBase");
            builder.LeftPar();
            builder.Indent();

            builder.WriteLine("private static readonly ConfigFieldInfo[] fields =");
            builder.WriteLine("{");
            builder.Indent();

            foreach (var pair in generator.RegisteredTypes)
            {
                if (pair.IsEntry && !pair.Root.PoliClass)
                {
                    VisitEntry(pair, builder);
                }
            }

            builder.UnIndent();
            builder.WriteLine("};");

            builder.EmptyLine();

            builder.WriteLine("public override ConfigFieldInfo[] Fields { get { return fields; } }");

            builder.EmptyLine();

            builder.WriteLine("public override string Hash {{ get {{ return \"{0}\"; }} }}", md5);

            builder.EmptyLine();

            builder.WriteLine("private static readonly Dictionary<Type, IConfigSerializer> serializers = new Dictionary<Type, IConfigSerializer>");
            builder.WriteLine("{");
            builder.Indent();

            foreach (var pair in generator.RegisteredTypes)
            {
                if ((pair.Root.PoliClass || !XmlUtil.IsPolymorphicClass(pair.Type)) && !pair.IsEnum)
                {
                    VisitSerializer(pair, builder);
                }
            }

            builder.UnIndent();
            builder.WriteLine("};");

            builder.EmptyLine();

            builder.WriteLine("public override Dictionary<Type, IConfigSerializer> Serializers { get { return serializers; } }");

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

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

            builder.WriteToFile(Path.Combine(targetFolder, "ConfigSerializer.cs"));
        }