示例#1
0
        private List <string> GenerateReadMethod(Type type)
        {
            var code            = new List <string>();
            var ReturnClassName = type.CompilableClassName();

            code.Add($"public static {ReturnClassName} Read(Serializer serializer)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            code.Add($"return new {ReturnClassName}");
            code.Add("{");
            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.Add(GeneratePropertyRead(p));
            }
            code.Add("};");
            code.Add("}");

            code.Add($"public static async Task<{ReturnClassName}> ReadAsync(Serializer serializer,");
            code.Add("CancellationToken cancellation)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            code.Add($"return new {ReturnClassName}");
            code.Add("{");
            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.Add(GeneratePropertyAsyncRead(p));
            }
            code.Add("};");
            code.Add("}");
            return(code);
        }
示例#2
0
        private List <string> GenerateWriteMethod(Type type)
        {
            var code = new List <string>();

            code.Add($"public static void Write({type.CompilableClassName()} value,");
            code.Add("Serializer2 serializer, Dictionary<Object,int> cache)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            code.Add($"if (value == null)");
            code.Add("{ packer.WriteInt32(0); return; }");
            code.Add("{");
            code.Add("if (cache.TryGetValue(value, out int id)) {");
            code.Add("packer.WriteInt32(id);");
            code.Add("return;");
            code.Add("}}");
            code.Add("{");
            code.Add("var id = cache.Count + 1;");
            code.Add("cache[value] = id;");
            code.Add("packer.WriteInt32(id);");
            code.Add("}");

            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.Add("{");
                code.AddRange(GeneratePropertyWrite(p));
                code.Add("}");
            }
            code.Add("}");

            code.Add($"public static async Task WriteAsync({type.CompilableClassName()} value,");
            code.Add("Serializer2 serializer, Dictionary<Object,int> cache, CancellationToken cancellation)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            code.Add($"if (value == null)");
            code.Add("{ await packer.WriteInt32Async(0, cancellation); return; }");
            code.Add("{");
            code.Add("if (cache.TryGetValue(value, out int id)) {");
            code.Add("await packer.WriteInt32Async(id, cancellation);");
            code.Add("return;");
            code.Add("}}");
            code.Add("{");
            code.Add("var id = cache.Count + 1;");
            code.Add("cache[value] = id;");
            code.Add("await packer.WriteInt32Async(id, cancellation);");
            code.Add("}");

            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.Add("{");
                code.AddRange(GeneratePropertyAsyncWrite(p));
                code.Add("}");
            }
            code.Add("}");
            return(code);
        }
示例#3
0
        private List <string> GenerateReadMethod(Type type)
        {
            var code            = new List <string>();
            var ReturnClassName = type.CompilableClassName();

            code.Add($"public static {ReturnClassName} Read(Serializer2 serializer, Dictionary<int, Object> cache)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            code.Add("var refId = packer.ReadInt32();");
            code.Add("if (refId == 0 ) return null;");
            code.Add($"if (cache.TryGetValue(refId, out object ret)) return ({ReturnClassName})ret;");
            code.Add($"var result = new {ReturnClassName}();");
            code.Add("cache[refId] = result;");

            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.Add("{");
                code.AddRange(GeneratePropertyRead(p));
                code.Add("};");
            }
            code.Add("return result;");
            code.Add("}");

            code.Add($"public static async Task<{ReturnClassName}> ReadAsync(Serializer2 serializer,");
            code.Add("Dictionary<int, Object> cache, CancellationToken cancellation)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            code.Add("var refId = await packer.ReadInt32Async(cancellation);");
            code.Add("if (refId == 0 ) return null;");
            code.Add($"if (cache.TryGetValue(refId, out object ret)) return ({ReturnClassName})ret;");
            code.Add($"var result = new {ReturnClassName}();");
            code.Add("cache[refId] = result;");

            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.Add("{");
                code.AddRange(GeneratePropertyAsyncRead(p));
                code.Add("};");
            }
            code.Add("return result;");
            code.Add("}");
            return(code);
        }
示例#4
0
        private List <string> GenerateWriteMethod(Type type)
        {
            var code = new List <string>();

            code.Add($"public static void Write({type.CompilableClassName()} value, Serializer serializer)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.AddRange(GeneratePropertyWrite(p));
            }
            code.Add("}");

            code.Add($"public static async Task WriteAsync({type.CompilableClassName()} value,");
            code.Add("Serializer serializer, CancellationToken cancellation)");
            code.Add("{");
            code.Add("var packer = serializer.Packer;");
            foreach (var p in PropertyFieldInfo.FindProperties(type))
            {
                code.AddRange(GeneratePropertyAsyncWrite(p));
            }
            code.Add("}");
            return(code);
        }