public void WriteDictionary(Type rType, bool bDynamic)
        {
            if (this.ReceiveGeneratedDictionaryType(rType, bDynamic))
            {
                return;
            }

            var rTypeName  = SerializerAssists.GetTypeName(rType);
            var rKeyType   = rType.GetGenericArguments()[0];
            var rValueType = rType.GetGenericArguments()[1];

            var rTDText  = bDynamic ? "Dynamic" : string.Empty;
            var rTDKText = bDynamic && !SerializerAssists.IsBaseType(rKeyType, false) ? "Dynamic" : string.Empty;
            var rTDVText = bDynamic && !SerializerAssists.IsBaseType(rValueType, false) ? "Dynamic" : string.Empty;

            this.StringBuilder?
            .T(2).F("public static void Serialize{0}(this BinaryWriter rWriter, {1} value)", rTDText, rTypeName).N()
            .T(2).A("{").N()
            .T(3).A("var bValid = (null != value);").N()
            .T(3).A("rWriter.Serialize(bValid);").N()
            .T(3).A("if (!bValid) return;").N()
            .L(1)
            .T(3).A("rWriter.Serialize(value.Count);").N()
            .T(3).A("foreach(var rPair in value)").N()
            .T(3).A("{").N()
            .T(4).F("rWriter.Serialize{0}({1});", rTDKText, (rKeyType.IsEnum ? "(int)rPair.Key" : "rPair.Key")).N()
            .T(4).F("rWriter.Serialize{0}({1});", rTDVText, (rValueType.IsEnum ? "(int)rPair.Value" : "rPair.Value")).N()
            .T(3).A("}").N()
            .T(2).A("}").N()
            .L(1);

            this.StringBuilder?
            .T(2).F("public static {0} Deserialize{1}(this BinaryReader rReader, {2} value)", rTypeName, rTDText, rTypeName).N()
            .T(2).A("{").N()
            .T(3).A("var bValid = rReader.Deserialize(default(bool));").N()
            .T(3).A("if (!bValid) return null;").N()
            .L(1)
            .T(3).A("var nCount  = rReader.Deserialize(default(int));").N()
            .T(3).F("var rResult = new {0}();", rTypeName).N()
            .T(3).A("for (int nIndex = 0; nIndex < nCount; ++ nIndex)").N()
            .T(3).A("{").N()
            .T(4).F("var rKey   = {0}rReader.Deserialize{1}({2});",
                    (rKeyType.IsEnum ? string.Format("({0})", rKeyType.FullName) : string.Empty),
                    rTDKText,
                    SerializerAssists.GetDeserializeUnwrap(rKeyType)).N()
            .T(4).F("var rValue = {0}rReader.Deserialize{1}({2});",
                    (rValueType.IsEnum ? string.Format("({0})", rValueType.FullName) : string.Empty),
                    rTDVText,
                    SerializerAssists.GetDeserializeUnwrap(rValueType)).N()
            .T(4).A("rResult.Add(rKey, rValue);").N()
            .T(3).A("}").N()
            .T(3).A("return rResult;").N()
            .T(2).A("}").N()
            .L(1);
        }
예제 #2
0
        public void Analysis(string rGeneratePathRoot, string rDLLModuleName, System.Action <string, float> rProgressAction = null)
        {
            string rGeneratePath         = rGeneratePathRoot;
            string rCommonSerializerPath = rGeneratePath + "CommonSerializer.cs";

            mClassSerializers = new List <CodeGenerator_ClassSerializer>();

            mCommonSerializer = new CodeGenerator_CommonSerializer(rCommonSerializerPath);
            mCommonSerializer.WriteHead();

            var rSBTypes = SerializerBinaryTypes.Types;

            for (int i = 0; i < rSBTypes.Count; i++)
            {
                if (!rSBTypes[i].Assembly.GetName().Name.Equals(rDLLModuleName))
                {
                    continue;
                }

                var rGroupName  = string.Empty;
                var rAttributes = rSBTypes[i].GetCustomAttributes <SBGroupAttribute>(true);
                if (rAttributes.Length > 0)
                {
                    rGroupName = rAttributes[0].GroupName;
                }
                var rClassSerializer = new CodeGenerator_ClassSerializer(UtilTool.PathCombine(rGeneratePath, rGroupName, rSBTypes[i].FullName + ".Binary.cs"));
                rClassSerializer.WriteHead();
                rClassSerializer.WriteClass(rSBTypes[i]);
                rClassSerializer.WriteEnd();

                mClassSerializers.Add(rClassSerializer);

                var rSerializeMemberInfo = SerializerAssists.FindSerializeMembers(rSBTypes[i]);
                foreach (var rMemberInfo in rSerializeMemberInfo)
                {
                    var bDynamic = rMemberInfo.IsDefined(typeof(SBDynamicAttribute), false);
                    if (rMemberInfo.MemberType == MemberTypes.Field)
                    {
                        mCommonSerializer.AnalyzeGenerateCommon((rMemberInfo as FieldInfo).FieldType, bDynamic);
                    }
                    else if (rMemberInfo.MemberType == MemberTypes.Property)
                    {
                        mCommonSerializer.AnalyzeGenerateCommon((rMemberInfo as PropertyInfo).PropertyType, bDynamic);
                    }
                }
                UtilTool.SafeExecute(rProgressAction, $"Generate File: {rSBTypes[i].FullName}", (float)i / (float)rSBTypes.Count);
                rClassSerializer.Save();
            }
            mCommonSerializer.WriteEnd();
            mCommonSerializer.Save();
        }
        public void WriteDictionary(Type rType, bool bDynamic)
        {
            if (this.ReceiveGeneratedDictionaryType(rType, bDynamic))
            {
                return;
            }

            var rTypeName  = SerializerAssists.GetTypeName(rType);
            var rKeyType   = rType.GetGenericArguments()[0];
            var rValueType = rType.GetGenericArguments()[1];

            var rTDText  = bDynamic ? "Dynamic" : string.Empty;
            var rTDKText = bDynamic && !SerializerAssists.IsBaseType(rKeyType, false) ? "Dynamic" : string.Empty;
            var rTDVText = bDynamic && !SerializerAssists.IsBaseType(rValueType, false) ? "Dynamic" : string.Empty;

            this.WriteBraceCode(2,
                                $"public static void Serialize{rTDText}(this BinaryWriter rWriter, {rTypeName} value)",
                                @"{",
                                $@"var bValid = (null != value);
			rWriter.Serialize(bValid);
			if (!bValid) return;

			rWriter.Serialize(value.Count);
            {this.GenerateBraceCode(0, 
            "foreach(var rPair in value)",
"            {",
$@"            rWriter.Serialize{rTDKText}({(rKeyType.IsEnum ? "(int)rPair.Key" : "rPair.Key")});
				rWriter.Serialize{rTDVText}({(rValueType.IsEnum ? "(int)rPair.Value" : "rPair.Value")});",
"            }")}",
                                "}");

            this.WriteBraceCode(2,
                                $"public static {rTypeName} Deserialize{rTDText}(this BinaryReader rReader, {rTypeName} value)",
                                @"{",
                                $@"var bValid = rReader.Deserialize(default(bool));
			if (!bValid) return null;

			var nCount  = rReader.Deserialize(default(int));
            var rResult = new {rTypeName}();
            {this.GenerateBraceCode(0,
            "for (int nIndex = 0; nIndex < nCount; ++ nIndex)",
"            {",
$@"            var rKey   = {(rKeyType.IsEnum ? string.Format("({0})", rKeyType.FullName) : string.Empty)}rReader.Deserialize{rTDKText}({SerializerAssists.GetDeserializeUnwrap(rKeyType)});
                var rValue = {(rValueType.IsEnum ? string.Format("({0})", rValueType.FullName) : string.Empty)}rReader.Deserialize{rTDVText}({SerializerAssists.GetDeserializeUnwrap(rValueType)});
                rResult.Add(rKey, rValue);",
"            }")}
            return rResult;",
                                "}");
        }
        public void WriteArray(Type rType, bool bDynamic)
        {
            if (this.ReceiveGeneratedArrayType(rType, bDynamic))
            {
                return;
            }

            var rTypeName    = SerializerAssists.GetTypeName(rType);
            var rElementType = rType.GetElementType();

            var rTDText  = bDynamic ? "Dynamic" : string.Empty;
            var rTDEText = bDynamic && !SerializerAssists.IsBaseType(rElementType, false) ? "Dynamic" : string.Empty;

            this.StringBuilder?
            .T(2).F("public static void Serialize{0}(this BinaryWriter rWriter, {1} value)", rTDText, rTypeName).N()
            .T(2).A("{").N()
            .T(3).A("var bValid = (null != value);").N()
            .T(3).A("rWriter.Serialize(bValid);").N()
            .T(3).A("if (!bValid) return;").N()
            .L(1)
            .T(3).A("rWriter.Serialize(value.Length);").N()
            .T(3).A("for (int nIndex = 0; nIndex < value.Length; nIndex++)").N()
            .T(4).F("rWriter.Serialize{0}({1});", rTDEText, (rElementType.IsEnum ? "(int)value[nIndex]" : "value[nIndex]")).N()
            .T(2).A("}").N()
            .L(1);

            this.StringBuilder?
            .T(2).F("public static {0} Deserialize(this BinaryReader rReader, {1} value)", rTypeName, rTypeName).N()
            .T(2).A("{").N()
            .T(3).A("var bValid = rReader.Deserialize(default(bool));").N()
            .T(3).A("if (!bValid) return null;").N()
            .L(1)
            .T(3).A("var nCount  = rReader.Deserialize(default(int));").N()
            .T(3).F("var rResult = new {0};", rTypeName.Insert(rTypeName.IndexOf('[') + 1, "nCount")).N()
            .T(3).A("for (int nIndex = 0; nIndex < nCount; nIndex++)").N()
            .T(4).F("rResult[nIndex] = {0}rReader.Deserialize{1}({2});",
                    (rElementType.IsEnum ? string.Format("({0})", rElementType.FullName) : string.Empty),
                    rTDEText,
                    SerializerAssists.GetDeserializeUnwrap(rElementType)).N()
            .T(3).A("return rResult;").N()
            .T(2).A("}").N()
            .L(1);
        }
        public void WriteArray(Type rType, bool bDynamic)
        {
            if (this.ReceiveGeneratedArrayType(rType, bDynamic))
            {
                return;
            }

            var rTypeName    = SerializerAssists.GetTypeName(rType);
            var rElementType = rType.GetElementType();

            var rTDText  = bDynamic ? "Dynamic" : string.Empty;
            var rTDEText = bDynamic && !SerializerAssists.IsBaseType(rElementType, false) ? "Dynamic" : string.Empty;

            this.WriteBraceCode(2,
                                $"public static void Serialize{rTDText}(this BinaryWriter rWriter, {rTypeName} value)",
                                "{",
                                $@"var bValid = (null != value);
	        rWriter.Serialize(bValid);
	        if (!bValid) return;

	        rWriter.Serialize(value.Length); 
	        for (int nIndex = 0; nIndex < value.Length; nIndex++)
                rWriter.Serialize{rTDEText}({(rElementType.IsEnum ? "(int)value[nIndex]" : "value[nIndex]")});",
                                "}");

            this.WriteBraceCode(2,
                                $"public static {rTypeName} Deserialize(this BinaryReader rReader, {rTypeName} value)",
                                "{",
                                $@"var bValid = rReader.Deserialize(default(bool));
			if (!bValid) return null;

            var nCount  = rReader.Deserialize(default(int));
            var rResult = new {rTypeName.Insert(rTypeName.IndexOf('[') + 1, "nCount")};
			for (int nIndex = 0; nIndex < nCount; nIndex++)
                rResult[nIndex] = {(rElementType.IsEnum ? string.Format("({0})", rElementType.FullName) : string.Empty)}rReader.Deserialize{rTDEText}({SerializerAssists.GetDeserializeUnwrap(rElementType)});
            return rResult;",
                                "}");
        }
        public void AnalyzeGenerateCommon(Type rType, bool bDynamic)
        {
            if (SerializerAssists.IsBaseType(rType))
            {
                return;
            }

            if (rType.IsArray)
            {
                WriteArray(rType, bDynamic);
                AnalyzeGenerateCommon(rType.GetElementType(), bDynamic);
            }
            else if (rType.GetInterface("System.Collections.IList") != null)
            {
                WriteList(rType, bDynamic);
                AnalyzeGenerateCommon(rType.GetGenericArguments()[0], bDynamic);
            }
            else if (rType.GetInterface("System.Collections.IDictionary") != null || rType.GetInterface("Knight.Core.IDict") != null)
            {
                WriteDictionary(rType, bDynamic);
                AnalyzeGenerateCommon(rType.GetGenericArguments()[0], bDynamic);
                AnalyzeGenerateCommon(rType.GetGenericArguments()[1], bDynamic);
            }
        }
예제 #7
0
        public void WriteClass(Type rType)
        {
            this.Write(0,
                       $"namespace {rType.Namespace}");
            this.Write(0,
                       "{");
            this.Write(1,
                       $"public partial class {rType.Name}");
            this.Write(1,
                       @"{
        public override void Serialize(BinaryWriter rWriter)
	    {
            base.Serialize(rWriter);");

            var rAllSerializeMembers = SerializerAssists.FindSerializeMembers(rType);

            for (int i = 0; i < rAllSerializeMembers.Count; i++)
            {
                var rMemberInfo = rAllSerializeMembers[i];
                var rParamText  = SerializerAssists.GetClassMemberDummyText(rAllSerializeMembers[i]);

                if (rMemberInfo.IsDefined(typeof(SBDynamicAttribute), true) &&
                    !SerializerAssists.IsBaseType(SerializerAssists.GetMemberType(rMemberInfo), false))
                {
                    this.Write(3, $"rWriter.SerializeDynamic({rParamText});");
                }
                else
                {
                    this.Write(3, $"rWriter.Serialize({rParamText});");
                }
            }
            this.Write(2,
                       "}");

            this.Write(2,
                       @"public override void Deserialize(BinaryReader rReader)
	    {
		    base.Deserialize(rReader);"        );

            for (int i = 0; i < rAllSerializeMembers.Count; i++)
            {
                var rMemberInfo      = rAllSerializeMembers[i];
                var rMemberText      = SerializerAssists.GetClassMemberTypeText(rMemberInfo);
                var rMemberDummyText = SerializerAssists.GetClassMemberDummyText(rMemberInfo);

                if (rMemberInfo.IsDefined(typeof(SBDynamicAttribute), false) &&
                    !SerializerAssists.IsBaseType(SerializerAssists.GetMemberType(rMemberInfo), false))
                {
                    this.Write(3, $"this.{rMemberInfo.Name} = {rMemberText}rReader.DeserializeDynamic({rMemberDummyText});");
                }
                else
                {
                    this.Write(3, $"this.{rMemberInfo.Name} = {rMemberText}rReader.Deserialize({rMemberDummyText});");
                }
            }
            this.Write(2,
                       @"}
    }
}
");
        }
        public void WriteClass(Type rType)
        {
            this.StringBuilder?
            .F("namespace {0}", rType.Namespace).N()
            .A("{").N()
            .T(1).F("public partial class {0}", rType.Name).N()
            .T(1).A("{").N()
            .T(2).A("public override void Serialize(BinaryWriter rWriter)").N()
            .T(2).A("{").N()
            .T(3).A("base.Serialize(rWriter);").N();

            var rAllSerializeMembers = SerializerAssists.FindSerializeMembers(rType);

            for (int i = 0; i < rAllSerializeMembers.Count; i++)
            {
                var rMemberInfo = rAllSerializeMembers[i];
                var rParamText  = SerializerAssists.GetClassMemberDummyText(rAllSerializeMembers[i]);

                if (rMemberInfo.IsDefined(typeof(SBDynamicAttribute), true) &&
                    !SerializerAssists.IsBaseType(SerializerAssists.GetMemberType(rMemberInfo), false))
                {
                    this.StringBuilder?
                    .T(3).F("rWriter.SerializeDynamic({0});", rParamText).N();
                }
                else
                {
                    this.StringBuilder?
                    .T(3).F("rWriter.Serialize({0});", rParamText).N();
                }
            }
            this.StringBuilder
            .T(2).A("}").N();

            this.StringBuilder
            .T(2).A("public override void Deserialize(BinaryReader rReader)").N()
            .T(2).A("{").N()
            .T(3).A("base.Deserialize(rReader);").N();

            for (int i = 0; i < rAllSerializeMembers.Count; i++)
            {
                var rMemberInfo      = rAllSerializeMembers[i];
                var rMemberText      = SerializerAssists.GetClassMemberTypeText(rMemberInfo);
                var rMemberDummyText = SerializerAssists.GetClassMemberDummyText(rMemberInfo);

                if (rMemberInfo.IsDefined(typeof(SBDynamicAttribute), false) &&
                    !SerializerAssists.IsBaseType(SerializerAssists.GetMemberType(rMemberInfo), false))
                {
                    this.StringBuilder
                    .T(3).F("this.{0} = {1}rReader.DeserializeDynamic({2});", rMemberInfo.Name, rMemberText, rMemberDummyText).N();
                }
                else
                {
                    this.StringBuilder
                    .T(3).F("this.{0} = {1}rReader.Deserialize({2});", rMemberInfo.Name, rMemberText, rMemberDummyText).N();
                }
            }

            this.StringBuilder
            .T(2).A("}").N()
            .T(1).A("}").N()
            .A("}").N();
        }