/// <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); } }
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()); } }
/// <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)); }