protected void AppendReadPart(ReadPartNode node, TextBuilder builder) { if (node.FirstChild is ArrayTypeNode) { VisitReadArray(VARIABLE, STREAM, node.FirstChild as ArrayTypeNode, builder); } else if (node.FirstChild is ListTypeNode) { VisitReadList(VARIABLE, STREAM, node.FirstChild as ListTypeNode, builder); } else if (node.FirstChild is DictionaryTypeNode) { VisitReadDictionary(VARIABLE, STREAM, node.FirstChild as DictionaryTypeNode, builder); } else if (node.FirstChild is HashSetTypeNode) { VisitReadHashSet(VARIABLE, STREAM, node.FirstChild as HashSetTypeNode, builder); } else if (node.FirstChild is PolyClassTypeNode) { VisitReadPolyClass(VARIABLE, STREAM, node.FirstChild as PolyClassTypeNode, builder); } else if (node.FirstChild is TwoDimArrayTypeNode) { VisitReadTwoDimArray(VARIABLE, STREAM, node.FirstChild as TwoDimArrayTypeNode, builder); } else if (node.FirstChild is StringTypeNode) { VisitReadString(VARIABLE, STREAM, builder); } else { AppendReadAllFields(node, builder); } }
public override void Generate(HashSet <RootType> referTypes) { if (Type.IsEnum) { GenerateEnum(referTypes); return; } AddChild(Header = new TypeNode(Root), referTypes); List <FieldInfo> fields; var customInterface = Type.GetInterfaces().FirstOrDefault(t => t.Name.StartsWith("ICustomSerialization")); if (customInterface != null) { var arguments = customInterface.GetGenericArguments(); CustomSerializeParams = new SerializeNode[arguments.Length]; for (int i = 0; i < arguments.Length; i++) { AddChild(CustomSerializeParams[i] = SerializeNode.Create(arguments[i]), referTypes); } fields = new List <FieldInfo>(); } else { fields = GetSerializeFields(Type); } AddChild(ReadPart = new ReadPartNode(Root, fields), referTypes); AddChild(WritePart = new WritePartNode(Root, fields), referTypes); FileName = Header.SerializerTypeName; }
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); } } }
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(); }