Реализация пользовательских Newtonsoft JsonConverter (ридер) - PullRequest
0 голосов
/ 10 марта 2020

У меня есть объект, который записывается в Json с помощью пользовательского Newtonsoft Jsonconverter. Объект имеет две переменные (массив точек vec3 и массив треугольников). Значения должны храниться в виде строк base64 внутри json.

. Писатель работает, как и ожидалось, но я не могу понять, как считать данные обратно и воссоздать объект.

Определение класса объекта:

public class Outline
{
    [JsonConverter(typeof(ObjectToBase64Converter))]
    public vec3[] Points { get; set; }
    [JsonConverter(typeof(ObjectToBase64Converter))]
    public int[] TriangleIndices { get; set; }
}

Пользовательский Json конвертер:

internal class ObjectToBase64Converter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // ?? I've got no clue ??

    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            new BinaryFormatter().Serialize(memoryStream, value);
            string base64String = Convert.ToBase64String(memoryStream.ToArray());
            writer.WriteValue(base64String);
        }
    }
}

Любая помощь будет принята с благодарностью Я застрял на этом часами.

1 Ответ

0 голосов
/ 10 марта 2020

Вы можете определить это следующим образом

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    JToken token = JToken.Load(reader);
    // Convert the Base64 Value to Bytes
    var dataBytes = Convert.FromBase64String(token.Value<String>());
    // Deserialize the Binary Formatted Data
    using (MemoryStream ms = new MemoryStream(dataBytes))
    {
        IFormatter br = new BinaryFormatter();
        return Convert.ChangeType(br.Deserialize(ms),objectType);
    }
}

...