Я рассматриваю Realm как решение для базы данных по разным причинам, но большая из них в настоящее время является TransactionTooLargeException, которая теперь выбрасывается в Nougat, поэтому я должен переделать свою текущую архитектуру базы данных, основанный на ActiveAndroid, который имеет свои собственные досадные ограничения. Трудность состоит в том, что Realm не поддерживает наследование (https://github.com/realm/realm-java/issues/761), и они не кажутся в какой-то конкретной спешке, чтобы обойти его. Вместо этого они рекомендуют использовать состав над наследованием, но я не могу понять, как это сделать с десериализацией Gson/Json.Композиция над наследованием для RealmObjects с сериализацией Gson
Пример:
суперкласса: Животное, с подклассами собачкой и немецкая овчарка
public class Animal {
private int numLegs;
private boolean hasFur;
}
public class Dog extends Animal {
private String color;
private boolean canDoTricks;
}
public class GermanShepherd extends Dog {
public boolean isGuardDog;
public boolean isAtRiskOfHipDysplasia()
}
(К сожалению, это супер консервированный пример, только для иллюстрации).
Теперь скажем, для JSON это выглядит следующим образом:
{
"numLegs" : 4,
"hasFur" : true,
"color" : "Black & Brown",
"canDoTricks" : true,
"isGuardDog" : true,
"isAtRiskofHipDysplasia" : false
}
Теперь я не могу изменить JSon, потому что это API, который дает мне.
Глядя на этот ответ: https://stackoverflow.com/a/41552457/4560689, кажется, что это очень опасный способ сделать его видом работы, но ответ отмечает, что существуют ограничения, в том числе, что сериализация будет неправильной. Поскольку сервер работает только в формате json, который не включает сумасшедшую композицию, это создает проблему.
Могу ли я написать собственный десериализатор/сериализатор Gson, чтобы сделать эту работу? Если да, то как это будет выглядеть? Я в основном должен иметь возможность конвертировать полезную нагрузку json в Объекты N, где N - 1 объекты вложены внутри базового объекта.
Так что с композицией (обратите внимание, что это не обязательно композиция «Царство», просто пример, так как похоже, что в Realm нужно использовать какую-то странную форму интерфейса-композиции), у меня будет класс, как показано ниже:
public class GermanShepherd {
public Animal animal;
public Dog dog;
// Generate a bunch of delegate methods here
}
Я лаю неправильное дерево? Похоже, что Realm может не работать для того, что я пытаюсь сделать, и наследование встроено в API, который я использую в нескольких местах, и конкретно в объектах, которые я хочу сохранить, поэтому мне нужно либо выяснить способ обхода или использовать другое решение. ActiveAndroid (то, что я использую сейчас) также является менее идеальным решением, и я болен до смерти, когда сталкиваюсь с обходом вокруг тупиков, сбоями, опросом фоновых потоков, которые теперь вызывают сбои, если данные слишком велики, чтобы пройти в Intent и т. Д. ... все проблемы с SQLite. Я открыт для решения моего основного вопроса или альтернатив, которые решают эту проблему. Заранее спасибо за вашу помощь!
Я тот, кто написал ответ, который вы опубликовали. Ну, есть способ обойти это, создав GermanShepard POJO (non realmObject), который будет сериализован так, как вам нравится, с Gson и сделайте какое-то сопоставление между realmObject вашего GermanShepard и этим POJO. Фактически, это то, что делал ppl для решения этой проблемы. Проверьте [это] (http://johnpetitto.com/no-more-realm). Если вы хотите, чтобы я написал пример о том, как это сделать, просто скажите мне, и я отправлю код ^^. Но я бы порекомендовал пользовательские сериализаторы, это лучший подход. – AnixPasBesoin
@AnixPasBesoin, спасибо за ответ! Я бы хотел, если это возможно, сделать пользовательские сериализаторы. У вас есть представление о том, как я могу сделать эту работу? Я просто использую Gson, как ранее, для десериализации ответа API в RealmObject, а затем сериализует RealmObject обратно в формат json, который ожидает API? –
Являются ли Gson и другие автосериализаторы странными для кого-либо еще? Лично я думаю, что предпочитаю просто сериализовать/десериализовать вручную ... некоторое повторение (нужно добавить новые поля в сериализатор и десериализатор), но я думаю, что это хороший уровень абстракции, который добавляет контроль и гибкость - обновление api не требуют обновления внутренних объектов объекта; как он разговаривает с api. –