Ejemplo n.º 1
0
        public void GenerateSerializeMethod(StringBuilder sb, SerializeInvocation invocation)
        {
            string invocationTypeStr = invocation.TypeArg.ToString();

            if (_generatedSerializationMethods.Contains(invocationTypeStr))
            {
                return;
            }
            _generatedSerializationMethods.Add(invocationTypeStr);

            string refprefix = "";

            if (ShouldUseRef(invocation.TypeArg))
            {
                refprefix = "ref ";
            }

            const string SPC = "    ";

            sb.Append($@"{SPC}{SPC}internal static string Serialize({refprefix}{invocationTypeStr} obj)");
            sb.Append(@"
        {
");
            GenerateSerializeMethodBody(sb, invocation);
            sb.Append(@"
        }

");
        }
Ejemplo n.º 2
0
        private void GenerateSerializeMethodBody(StringBuilder sb, SerializeInvocation invocation)
        {
            // Create nodes
            TreeContext treeContext = new TreeContext();

            treeContext.IndentCSharp(+3);
            string ct = treeContext.CSharpIndent;

            List <MethodNode> nodes = new List <MethodNode>();

            nodes.Add(new CSharpLineNode($"{ct}StringBuilder sb = new StringBuilder();"));

            JsonNode jsonTree = BuildTree(invocation.TypeArg, "obj");

            if (jsonTree is null)
            {
                string invocationTypeStr = invocation.TypeArg.ToString();
                nodes.Add(new CSharpLineNode($"{ct}// Type '{invocationTypeStr}' isn't marked as serializable!"));
            }
            else
            {
                nodes.AddRange(jsonTree.GetNodes(treeContext));
            }

            ct = treeContext.CSharpIndent;
            nodes.Add(new CSharpLineNode($"{ct}return sb.ToString();"));

            // Merge json nodes
            List <MethodNode>    mergedNodes = new List <MethodNode>();
            List <PlainJsonNode> streak      = new List <PlainJsonNode>();

            foreach (MethodNode node in nodes)
            {
                if (node is PlainJsonNode js)
                {
                    streak.Add(js);
                }
                else
                {
                    if (streak.Count > 0)
                    {
                        mergedNodes.Add(MergeJsonNodes(streak));
                        streak.Clear();
                    }
                    mergedNodes.Add(node);
                }
            }

            if (streak.Count > 0)
            {
                mergedNodes.Add(MergeJsonNodes(streak.OfType <PlainJsonNode>()));
            }

            nodes = mergedNodes;

            // Convert json to C#
            for (int i = 0; i < nodes.Count; ++i)
            {
                if (nodes[i] is PlainJsonNode js)
                {
                    CSharpNode cs = new CSharpLineNode($"{js.CSharpIndent}sb.Append(\"{js.Value.Replace("\"", "\\\"")}\");");
                    nodes.RemoveAt(i);
                    nodes.Insert(i, cs);
                }
            }

            // Output as string
            foreach (MethodNode node in mergedNodes)
            {
                if (node is CSharpNode cs)
                {
                    sb.Append(cs.CSharpCode);
                }
            }
        }