Схема времени исполнения прототипа и проблемы полиморфизма - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть иерархия классов в Java, которую я хочу сериализовать и десериализовать, используя protostuff.

Классы следующие (просто игрушечный пример)

class Wrapper {
    public List<Being> beings;
}

class Being {
    public Animal animal;
}

class Animal {
    public String sex;
    public int legs;
}

class Antelope extends Animal {
    public int speed;
    public String furType;
}

class Spider extends Animal {
    public int numberOfEyes;
    public int size;
}

Яиспользование следующего кода для сериализации и десериализации объектов с использованием генерации схемы времени выполнения следующим образом:

public static void main(String[] args) {
    LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024);

    Being b1 = new Being();
    Antelope a1 = new Antelope();
    a1.legs = 4;
    a1.furType = "Fuzzy";
    a1.sex = "M";
    a1.speed = 70;
    b1.animal = a1;

    Being b2 = new Being();
    Spider s1 = new Spider();
    s1.legs = 4;
    s1.sex = "M";
    s1.numberOfEyes = 8;
    s1.size = 2;
    b2.animal = s1;

    Wrapper w = new Wrapper();
    w.beings = new ArrayList<>();
    w.beings.add(b1);
    w.beings.add(b2);

    // Serialize
    Schema<Wrapper> schema = RuntimeSchema.getSchema(Wrapper.class);
    byte[] data = ProtostuffIOUtil.toByteArray(w, schema, buffer);

    // Deserialize
    Wrapper w1 = schema.newMessage();
    ProtostuffIOUtil.mergeFrom(data, w1, schema);

    System.out.println(w1.beings.get(0).animal.getClass());
    System.out.println(w1.beings.get(1).animal.getClass());
}

Проблема заключается в том, что вывод этого кода

class Animal
class Animal

вместо

class Antelope
class Spider

Как сохранить информацию о полиморфизме во время сериализации / десериализации?

Надеюсь, кто-нибудь может мне помочь

1 Ответ

0 голосов
/ 06 февраля 2019

Попробуйте включить системное свойство, как описано в соответствующем тесте:

https://github.com/protostuff/protostuff/blob/master/protostuff-runtime/src/test/java/io/protostuff/runtime/InheritanceTest.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...