Как десериализовать пользовательскую структуру только для чтения, требующую вызова ctor, используя protobuf-net?

Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
1
задан Morten Mertner 10 March 2019 в 00:31
поделиться

1 ответ

, struct, и, в частности, readonly struct, я планирую уделить больше внимания в версии 3, в которой есть планы для новых API-интерфейсов сериализатора. Между тем, это не тот сценарий, с которым он хорошо справляется, но ваша лучшая ставка может быть «суррогатами» - это означает, что сериализатор в значительной степени игнорирует Amount, используя что-то еще вместо этого для более удобной сериализации. Это также означает, что вы можете удалить любые атрибуты сериализатора или API из Amount:

using ProtoBuf;
using ProtoBuf.Meta;

static class P
{
    static void Main()
    {
        // only need to do this once, *before*
        // serializing/deserialing anything
        RuntimeTypeModel.Default.Add(typeof(Amount), false)
            .SetSurrogate(typeof(AmountSurrogate));

        // test it works
        var obj = new Foo { Amount = new Amount(123.45M) };
        var clone = Serializer.DeepClone(obj);
        System.Console.WriteLine(clone.Amount.Value);
    }
}
[ProtoContract]
public class Foo
{
    [ProtoMember(1)]
    public Amount Amount { get; set; }
}

[ProtoContract]
struct AmountSurrogate
{ // a nice simple type for serialization
    [ProtoMember(1)]
    public long Value { get; set; }

    // operators define how to get between the two types
    public static implicit operator Amount(AmountSurrogate value)
        => Amount.CreateFrom(value.Value);
    public static implicit operator AmountSurrogate(Amount value)
        => new AmountSurrogate { Value = value.ScaledValue };
}
0
ответ дан Marc Gravell 10 March 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: