public override System.CodeDom.CodeMemberMethod GetSerializerMethod() { CodeMemberMethod method = base.GetSerializerMethod(); // No point doing anything if there is no length to write if (_reference.IsValid()) { method.Statements.Add(GetWriterExpression(CodeGen.GetWriter(), CodeGen.GetObject())); } return(method); }
public override CodeExpression GetReaderExpression(CodeExpression reader) { CodeExpression refExpr; if (_magicParser) { List <CodeExpression> args = new List <CodeExpression>(); args.Add(reader); foreach (SequenceChoice choice in _choices) { if (choice.SequenceType != null) { args.Add(CodeGen.GetTypeOf(new CodeTypeReference(choice.SequenceType.Name))); } } if (DefaultType != null) { args.Add(CodeGen.GetTypeOf(new CodeTypeReference(DefaultType.Name))); } return(CodeGen.CallMethod(CodeGen.GetThis(), "RSC", args.ToArray())); } else { if (_reference.IsValid()) { refExpr = CodeGen.GetField(CodeGen.GetThis(), _reference.GetNames()); } else { refExpr = CodeGen.GetPrimitive(null); } List <CodeExpression> args = new List <CodeExpression>(); args.Add(reader); args.Add(refExpr); foreach (SequenceChoice choice in _choices) { if ((choice.BooleanExpression.IsValid) && (choice.SequenceType != null)) { args.Add(CodeGen.GetPrimitive(choice.BooleanExpression.Expression)); args.Add(CodeGen.GetTypeOf(new CodeTypeReference(choice.SequenceType.Name))); } } if (DefaultType != null) { args.Add(CodeGen.GetPrimitive("true")); args.Add(CodeGen.GetTypeOf(new CodeTypeReference(DefaultType.Name))); } return(CodeGen.CallMethod(CodeGen.GetThis(), "RSC", args.ToArray())); } }
public override System.CodeDom.CodeMemberMethod GetDeserializerMethod() { CodeMemberMethod method = base.GetDeserializerMethod(); IMemberReaderWriter entry = BaseEntry as IMemberReaderWriter; if (_reference.IsValid()) { CodeTypeReference listType = CodeGen.CreateGenericType(typeof(List <>), BaseEntry.GetTypeReference()); List <CodeStatement> loopStatements = new List <CodeStatement>(); method.Statements.Add(CodeGen.MakeVariable(listType, "ret", CodeGen.CreateObject(listType))); method.Statements.Add(CodeGen.MakeVariable(typeof(int), "length", GetLength())); loopStatements.Add(CodeGen.GetStatement(CodeGen.CallMethod(CodeGen.GetVariable("ret"), "Add", entry.GetReaderExpression(CodeGen.GetReader())))); if (_isByteLength) { // Reassign reader to just the sub data method.Statements.Add(CodeGen.MakeVariable(typeof(DataReader), "reader", CodeGen.CreateObject(typeof(DataReader), CodeGen.CallMethod(CodeGen.GetArgument("reader"), "ReadBytes", GetLength())))); method.Statements.Add(CodeGen.GetTryCatch(new CodeStatement[] { CodeGen.GetInfLoop(loopStatements.ToArray()) }, typeof(EndOfStreamException))); method.Statements.Add(CodeGen.CallMethod(CodeGen.GetArgument("reader"), "Flush")); } else { method.Statements.Add(CodeGen.GetForLoop("i", 0, CodeGen.GetVariable("length"), 1, loopStatements.ToArray())); } method.Statements.Add(CodeGen.GetReturn(CodeGen.CallMethod(CodeGen.GetVariable("ret"), "ToArray"))); } else { method.Statements.Add(CodeGen.GetReturn(CodeGen.CreateArray(GetTypeReference(), 0))); } return(method); }