void UniversalWriterSubnodes(SerializationWriterContext ctx, object instance, IEnumerable <Element> elements) { // PROPERTY as SUBNODE: // composite not null // collection foreach (var element in elements.OrderBy(x => x.Name)) { var subObj = element.GetValue(instance); if (!IsInAttrib(subObj)) { var subList = subObj as IList; if (subObj != null && (subList == null || subList.Count > 0)) // subList == null - this is composite { ctx.Write($"{Indentation(ctx.Indentation)}<{instance.GetType().Name}.{element.Name}>"); ctx.Indentation++; if (subList != null) { ctx.Result.AppendLine(); for (int index = 0; index < subList.Count; index++) { var item = subList[index]; GetWriter(item.GetType())(ctx, item); } } else { UniversalWriter(ctx, subObj); } ctx.Indentation--; ctx.WriteLine($"{Indentation(ctx.Indentation)}</{instance.GetType().Name}.{element.Name}>"); } } } }
public static async Task SerializeAsync(Uri baseUri, OeParseUriContext parseUriContext, Db.OeEntityAsyncEnumerator asyncEnumerator, Stream stream) { IEdmModel edmModel = parseUriContext.EdmModel; OeEntryFactory entryFactory = parseUriContext.EntryFactory; String contentType = parseUriContext.Headers.ContentType; var settings = new ODataMessageWriterSettings() { BaseUri = baseUri, EnableMessageStreamDisposal = false, ODataUri = parseUriContext.ODataUri, Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, edmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType); var getWriter = new GetWriter(baseUri, parseUriContext.Headers.MetadataLevel, writer); await getWriter.SerializeAsync(entryFactory, asyncEnumerator, stream); } }
public static async Task SerializeAsync(OeQueryContext queryContext, Db.OeAsyncEnumerator asyncEnumerator, String contentType, Stream stream) { OeEntryFactory entryFactory = queryContext.EntryFactory; var settings = new ODataMessageWriterSettings() { BaseUri = queryContext.ODataUri.ServiceRoot, EnableMessageStreamDisposal = false, ODataUri = queryContext.ODataUri, Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames, Version = ODataVersion.V4 }; IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType); using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, queryContext.EdmModel)) { ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet); ODataWriter writer = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType); var getWriter = new GetWriter(queryContext, writer); await getWriter.SerializeAsync(entryFactory, asyncEnumerator, queryContext).ConfigureAwait(false); } }
private static Action <StringBuilder, object?> Build(Type type) { if (type.IsValueType || type == typeof(string) || type == typeof(V)) { return((builder, o) => builder.Append(o)); } if (type.IsAbstract) { return((builder, o) => { if (ReferenceEquals(o, null)) { return; } var runtimeType = o.GetType(); builder.Append('<'); builder.Append(runtimeType.Name); builder.Append('>'); GetWriter(runtimeType)(builder, o); }); } if (typeof(IEnumerable).IsAssignableFrom(type)) { var elementType = type.GetInterfaces().Single(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable <>)).GetGenericArguments()[0]; var elementWriter = GetWriter(elementType); return((builder, o) => { if (ReferenceEquals(o, null)) { return; } builder.Append('['); var first = true; foreach (var element in (IEnumerable)o) { if (!first) { builder.Append(", "); } else { first = false; } elementWriter(builder, element); } builder.Append(']'); }); } var actions = new List <Action <StringBuilder, object> >(); foreach (var prop in GetProperties(type)) { Action <StringBuilder, object?> propWriter = DoWrite; var parameter = Expression.Parameter(typeof(object)); var getter = (Func <object, object>)Expression.Lambda( Expression.Convert( Expression.Property( Expression.Convert(parameter, type), prop), typeof(object)), parameter) .Compile(); actions.Add((builder, o) => { if (builder.Length > 0 && builder[^ 1] != '{') { builder.Append(", "); } builder.Append(prop.Name); builder.Append(':'); propWriter(builder, getter(o)); }); } return((builder, o) => { if (ReferenceEquals(o, null)) { return; } builder.Append('{'); foreach (var action in actions) { action(builder, o); } builder.Append('}'); }); }