Джексон сериализация абстрактного интерфейса

За кулисами компилятор генерирует класс, который представляет собой замыкание для вызова метода. Он использует этот единственный экземпляр класса закрытия для каждой итерации цикла. Код выглядит примерно так: это облегчает просмотр ошибки:

void Main()
{
    List<Func<int>> actions = new List<Func<int>>();

    int variable = 0;

    var closure = new CompilerGeneratedClosure();

    Func<int> anonymousMethodAction = null;

    while (closure.variable < 5)
    {
        if(anonymousMethodAction == null)
            anonymousMethodAction = new Func<int>(closure.YourAnonymousMethod);

        //we're re-adding the same function 
        actions.Add(anonymousMethodAction);

        ++closure.variable;
    }

    foreach (var act in actions)
    {
        Console.WriteLine(act.Invoke());
    }
}

class CompilerGeneratedClosure
{
    public int variable;

    public int YourAnonymousMethod()
    {
        return this.variable * 2;
    }
}

На самом деле это не скомпилированный код из вашего примера, но я изучил свой собственный код и этот очень похоже на то, что на самом деле генерирует компилятор.

0
задан ak. 16 January 2019 в 20:17
поделиться

1 ответ

Jackson позволяет настраивать сторонние классы, используя функцию, называемую MixIn. Для дополнительной информации читайте:

  1. Джексон Миксин на помощь
  2. Джексон Mix-In аннотации
[1113 ] Вам нужно указать два новых интерфейса, которые позволят вам добавлять аннотации для других классов:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({@JsonSubTypes.Type(value = MySupplier.class, name = "MySupplier")})
interface SupplierAnnotations {
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
        @JsonSubTypes.Type(value = MyCalculator.class, name = "MyCalculator"),
        @JsonSubTypes.Type(value = HisCalculator.class, name = "HisCalculator") }
)
interface CalculatorAnnotations {
}

Теперь вы должны сообщить ObjectMapper о ваших новых классах. Вы можете сделать это следующим образом:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Calculator.class, CalculatorAnnotations.class);
mapper.addMixIn(Supplier.class, SupplierAnnotations.class);

Все, что вам нужно сделать, это перечислить подтипы для интерфейсов Suplier и Calculator.

0
ответ дан Michał Ziober 16 January 2019 в 20:17
поделиться
Другие вопросы по тегам:

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