예제 #1
0
 /// <summary>
 /// Writes the body of an object in the output
 /// </summary>
 public override void WriteObjectContent(XmlDictionaryWriter writer, object graph)
 {
     if (writer == null)
     {
         throw new ArgumentNullException(nameof(writer));
     }
     if (graph == null)
     {
         writer.WriteAttributeString("nil", "true");
     }
     else
     {
         using MemoryStream ms = new MemoryStream();
         var state = ProtoWriter.State.Create(ms, model, null);
         try
         {
             if (!DynamicStub.TrySerializeRoot(type, model, ref state, graph))
             {
                 TypeModel.ThrowUnexpectedType(type, model);
             }
         }
         catch
         {
             state.Abandon();
             throw;
         }
         finally
         {
             state.Dispose();
         }
         Helpers.GetBuffer(ms, out var segment);
         writer.WriteBase64(segment.Array, segment.Offset, segment.Count);
     }
 }
예제 #2
0
        public void CanSerializeUnknownEnum()
        {
            var model = RuntimeTypeModel.Create();

            Assert.True(model.CanSerialize(typeof(EnumWithThings)));
            Assert.True(DynamicStub.CanSerialize(typeof(EnumWithThings), model, out var features));
            Assert.Equal(SerializerFeatures.CategoryScalar, features.GetCategory());
            Assert.True(DynamicStub.CanSerialize(typeof(EnumWithThings?), model, out features));
            Assert.Equal(SerializerFeatures.CategoryScalar, features.GetCategory());

            using var ms = new MemoryStream();


            var writeState = ProtoWriter.State.Create(ms, null);

            try
            {
                Assert.True(DynamicStub.TrySerializeAny(1, WireType.Varint.AsFeatures(), typeof(EnumWithThings), model, ref writeState, EnumWithThings.HazThis));
                Assert.True(DynamicStub.TrySerializeAny(2, WireType.Varint.AsFeatures(), typeof(EnumWithThings?), model, ref writeState, EnumWithThings.HazThis));
                writeState.Close();
            }
            catch
            {
                writeState.Abandon();
                throw;
            }
            finally
            {
                writeState.Dispose();
            }
            ms.Position = 0;

            var readState = ProtoReader.State.Create(ms, null);

            try
            {
                object val = null;
                Assert.Equal(1, readState.ReadFieldHeader());
                Assert.True(DynamicStub.TryDeserialize(ObjectScope.Scalar, typeof(EnumWithThings), model, ref readState, ref val));
                Assert.Equal(typeof(EnumWithThings), val.GetType());

                val = null;
                Assert.Equal(2, readState.ReadFieldHeader());
                Assert.True(DynamicStub.TryDeserialize(ObjectScope.Scalar, typeof(EnumWithThings?), model, ref readState, ref val));
                Assert.Equal(typeof(EnumWithThings), val.GetType());
                val = null;

                Assert.Equal(0, readState.ReadFieldHeader());
            }
            finally
            {
                readState.Dispose();
            }
        }
 public RouteAction Handle(ICall call)
 {
     if (ReturnsDynamic(call))
     {
         var stubToReturn = new DynamicStub();
         _configureCall.SetResultForCall(call, new ReturnValue(stubToReturn), MatchArgs.AsSpecifiedInCall);
         return(RouteAction.Return(new DynamicStub()));
     }
     else
     {
         return(RouteAction.Continue());
     }
 }
예제 #4
0
        /// <summary>
        /// Reads the body of an object
        /// </summary>
        public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            reader.MoveToContent();
            bool isSelfClosed = reader.IsEmptyElement, isNil = reader.GetAttribute("nil") == "true";

            reader.ReadStartElement(PROTO_ELEMENT);

            // explicitly null
            if (isNil)
            {
                if (!isSelfClosed)
                {
                    reader.ReadEndElement();
                }
                return(null);
            }
            object ReadFrom(ReadOnlyMemory <byte> payload)
            {
                var state = ProtoReader.State.Create(payload, model, null);

                try
                {
                    object result = null;
                    if (!DynamicStub.TryDeserializeRoot(type, model, ref state, ref result, autoCreate))
                    {
                        TypeModel.ThrowUnexpectedType(type, model);
                    }
                    return(result);
                }
                finally
                {
                    state.Dispose();
                }
            }

            if (isSelfClosed) // no real content
            {
                return(ReadFrom(Array.Empty <byte>()));
            }


            Debug.Assert(reader.CanReadBinaryContent, "CanReadBinaryContent");
            ReadOnlyMemory <byte> payload = reader.ReadContentAsBase64();

            reader.ReadEndElement();
            return(ReadFrom(payload));
        }