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);
        }
Exemplo n.º 2
0
        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()));
            }
        }
Exemplo n.º 3
0
        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);
        }