/// <inheritdoc/> public JToken Encode(Variant value, out BuiltInType builtinType, ServiceMessageContext context) { if (value == Variant.Null) { builtinType = BuiltInType.Null; return(JValue.CreateNull()); } using (var stream = new MemoryStream()) { using (var encoder = new JsonEncoderEx(stream, context ?? Context) { UseAdvancedEncoding = true }) { encoder.WriteVariant(nameof(value), value); } var json = Encoding.UTF8.GetString(stream.ToArray()); try { var token = JToken.Parse(json); Enum.TryParse((string)token.SelectToken("value.Type"), true, out builtinType); return(token.SelectToken("value.Body")); } catch (JsonReaderException jre) { throw new FormatException($"Failed to parse '{json}'. " + "See inner exception for more details.", jre); } } }
/// <inheritdoc/> public VariantValue Encode(Variant?value, out BuiltInType builtinType) { if (value == null || value == Variant.Null) { builtinType = BuiltInType.Null; return(VariantValue.Null); } using (var stream = new MemoryStream()) { using (var encoder = new JsonEncoderEx(stream, Context) { UseAdvancedEncoding = true }) { encoder.WriteVariant(nameof(value), value.Value); } var token = Serializer.Parse(stream.ToArray()); Enum.TryParse((string)token.GetByPath("value.Type"), true, out builtinType); return(token.GetByPath("value.Body")); } }