Я пытаюсь сериализовать хэшмапы и коллекции двух пользовательских классов (содержащих больше хэш-карт и коллекций).Сериализация Kryo вызвала фатальную ошибку времени выполнения Java с пользовательскими объектами
Class1: NodeStorage.java
@NotNull
private final String id;
@Nullable
private String type;
@Nullable
private HashMap<String, String> properties;
Class2: RelationshipStorage.java
@NotNull
private final String id;
@Nullable
private String type;
@Nullable
private HashMap<String, String> properties;
@NotNull
private final NodeStorage startNode;
@NotNull
private final NodeStorage endNode;
коллекции сериализовать:
private HashMap<NodeStorage, NodeStorage> readsSetNode;
private HashMap<NodeStorage, NodeStorage> updateSetNode;
private ArrayList<NodeStorage> deleteSetNode;
private ArrayList<NodeStorage> createSetNode;
private HashMap<RelationshipStorage, RelationshipStorage> readsSetRelationship;
private HashMap<RelationshipStorage, RelationshipStorage> updateSetRelationship;
private ArrayList<RelationshipStorage> deleteSetRelationship;
private ArrayList<RelationshipStorage> createSetRelationship;
То, что я пытался до сих пор:
kryo.register(NodeStorage.class, 1);
kryo.register(RelationshipStorage.class, 2);
kryo.register(HashMap.class, mapSerializer);
mapSerializer.setKeyClass(NodeStorage.class, kryo.getSerializer(NodeStorage.class));
mapSerializer.setKeyClass(RelationshipStorage.class, kryo.getSerializer(RelationshipStorage.class));
mapSerializer.setValuesCanBeNull(false);
mapSerializer.setKeysCanBeNull(false);
listSerializer.setElementClass(NodeStorage.class, kryo.getSerializer(NodeStorage.class));
listSerializer.setElementClass(RelationshipStorage.class, kryo.getSerializer(RelationshipStorage.class));
listSerializer.setElementsCanBeNull(false);
public byte[] serialize()
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Output output = new Output(stream);
mapSerializer.write(kryo, output, readsSetNode);
byte[] bytes = output.toBytes();
output.close();
return bytes;
}
Я попробовал это с kryo.writeclassandobject, но это не сработало. Я получаю:
> > #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # SIGSEGV (0xb) at pc=0x00007f92f7f6efe0, pid=4637, tid=0x00007f92f94fd700
> #
> # JRE version: OpenJDK Runtime Environment (8.0_102-b14) (build 1.8.0_102-b14)
> # Java VM: OpenJDK 64-Bit Server VM (25.102-b14 mixed mode linux-amd64 compressed oops)
> # Problematic frame:
> # V [libjvm.so+0x787fe0]
> #
> # Core dump written
Полный код по адресу: https://github.com/Raycoms/thesis
декларации:
private Kryo kryo = new Kryo();
MapSerializer mapSerializer = new MapSerializer();
CollectionSerializer listSerializer = new CollectionSerializer();
Можете ли вы попытаться начать с 100 вместо 1 в качестве первого идентификатора? См. Https://github.com/EsotericSoftware/kryo/issues/430 – MartinGrotzke
. Установите его на 100 и 200, ничего не изменив. Такое же сообщение об ошибке. – user2524707
Может быть связанным с потоком - см. [Этот вопрос GitHub] (https://github.com/EsotericSoftware/kryo/issues/426#issuecomment-243239835), который кажется схожим. С помощью [thread-pooling readme] (https://github.com/EsotericSoftware/kryo#pooling-kryo-instances), связанного с ним, помог хотя бы один другой кодер.(Обнаружено это путем проверки трассировки стека в [вашем журнале] (https://github.com/Raycoms/thesis/blob/master/hs_err_pid11037.log).) – cxw