in src/StreamJsonRpc/MessagePackFormatter.cs [1823:1902]
public void Serialize(ref MessagePackWriter writer, Protocol.JsonRpcRequest value, MessagePackSerializerOptions options)
{
var topLevelPropertyBagMessage = value as IMessageWithTopLevelPropertyBag;
int mapElementCount = value.RequestId.IsEmpty ? 3 : 4;
if (value.TraceParent?.Length > 0)
{
mapElementCount++;
if (value.TraceState?.Length > 0)
{
mapElementCount++;
}
}
mapElementCount += topLevelPropertyBagMessage?.TopLevelPropertyBag?.PropertyCount ?? 0;
writer.WriteMapHeader(mapElementCount);
WriteProtocolVersionPropertyAndValue(ref writer, value.Version);
if (!value.RequestId.IsEmpty)
{
IdPropertyName.Write(ref writer);
options.Resolver.GetFormatterWithVerify<RequestId>().Serialize(ref writer, value.RequestId, options);
}
MethodPropertyName.Write(ref writer);
writer.Write(value.Method);
ParamsPropertyName.Write(ref writer);
if (value.ArgumentsList is not null)
{
writer.WriteArrayHeader(value.ArgumentsList.Count);
for (int i = 0; i < value.ArgumentsList.Count; i++)
{
object? arg = value.ArgumentsList[i];
if (value.ArgumentListDeclaredTypes is object)
{
MessagePackSerializer.Serialize(value.ArgumentListDeclaredTypes[i], ref writer, arg, this.formatter.userDataSerializationOptions);
}
else
{
DynamicObjectTypeFallbackFormatter.Instance.Serialize(ref writer, arg, this.formatter.userDataSerializationOptions);
}
}
}
else if (value.NamedArguments is not null)
{
writer.WriteMapHeader(value.NamedArguments.Count);
foreach (KeyValuePair<string, object?> entry in value.NamedArguments)
{
writer.Write(entry.Key);
if (value.NamedArgumentDeclaredTypes?[entry.Key] is Type argType)
{
MessagePackSerializer.Serialize(argType, ref writer, entry.Value, this.formatter.userDataSerializationOptions);
}
else
{
DynamicObjectTypeFallbackFormatter.Instance.Serialize(ref writer, entry.Value, this.formatter.userDataSerializationOptions);
}
}
}
else
{
writer.WriteNil();
}
if (value.TraceParent?.Length > 0)
{
TraceParentPropertyName.Write(ref writer);
options.Resolver.GetFormatterWithVerify<TraceParent>().Serialize(ref writer, new TraceParent(value.TraceParent), options);
if (value.TraceState?.Length > 0)
{
TraceStatePropertyName.Write(ref writer);
WriteTraceState(ref writer, value.TraceState);
}
}
topLevelPropertyBagMessage?.TopLevelPropertyBag?.WritePropertiesAndClear(ref writer);
}