Android Realm Gson ClassNotFoundexception Class.forName io.realm. <Type>RealmProxy - PullRequest
0 голосов
/ 24 января 2019

Попытка создать строку json из объекта области с помощью Gson, в соответствии с этим SerializeToJson.java . И раньше он работал нормально с realm 4.0, но не с realm 5.8.0. Получение java.lang.ClassNotFoundException: io.realm.LevelRealmProxy Что-то не хватает? В любом случае, вот мой код:

 public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        setUpRealm();
        checkProxy();
    }

    private void setUpRealm() {
        Realm.init(this);
    }

    private void checkProxy() {

        Realm realm = null;
        try {
            Gson gson = new GsonBuilder()
                    .setExclusionStrategies(new ExclusionStrategy() {
                        @Override
                        public boolean shouldSkipField(FieldAttributes f) {
                            return f.getDeclaringClass().equals(RealmObject.class);
                        }

                        @Override
                        public boolean shouldSkipClass(Class<?> clazz) {
                            return false;
                        }
                    })
                    .registerTypeAdapter(Class.forName("io.realm.LevelRealmProxy"), new LevelSerializer())
                    .create();

            // Serialize a Realm object to a JSON string
            realm = Realm.getDefaultInstance();
            Log.d("MyLogs", gson.toJson(realm.where(Level.class).findFirst()));

        } catch (ClassNotFoundException e) {
            Log.e("MyLogs", e.toString());
            e.printStackTrace();
        } finally {
            if (realm != null) realm.close();
        }
    }

RealmObject

public class Level extends RealmObject {

    String id;
    int order;

}

TopLevel Gradle

dependencies {
    classpath 'com.android.tools.build:gradle:3.3.0'
    classpath "io.realm:realm-gradle-plugin:5.8.0"
}

Уровень приложения Gradle

apply plugin: 'com.android.application'
apply plugin: 'realm-android'

android {
    compileSdkVersion 28

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

dependencies {
    implementation 'com.google.code.gson:gson:2.8.5'
}

Я нашел обходной путь, используя copyFromRealm() для RealmObject вместо использования registerTypeAdapter для Gson

1 Ответ

0 голосов
/ 24 января 2019

Начиная с Realm 5.0.0, прокси-классы содержат FQN в качестве префикса RealmProxy вместо простого имени класса.Таким образом, io.realm.LevelRealmProxy теперь io.realm.yourpackage_to_the_realmobject_LevelRealmProxy (для поддержки нескольких объектов RealmObject с одним и тем же именем в разных пакетах).

...