Я хотел бы сериализовать и кэшировать в Hazelcast @Entity, который имеет двунаправленную связь с другим @ Entity.
Я ищу то, что считается официальной наилучшей практикой в таком сценарии - решение, которое бы :
- правильно сериализует иерархию классов, которая содержит, возможно, нулевые ссылки, а также ссылки на наборы и списки
- обрабатывает циклы ссылок в графе
Так В первом случае мне удалось реализовать DataSerializable в каждом @Entity моего графа. Я работаю со значениями NULL и множеств следующим образом:
@Override
public void writeData(ObjectDataOutput out) throws IOException {
out.writeBoolean(certificationNumber != null);
if (certificationNumber != null)
out.writeUTF(certificationNumber);
out.writeShort(getSkills().size());
for (SkillEntity s: getSkills())
s.writeData(out);
}
@Override
public void readData(ObjectDataInput in) throws IOException {
if (in.readBoolean()) {
certification = new CertificationEntity();
certification.readData(in);
}
short size = in.readShort();
skills = new HashSet<>();
for(int i=0; i<size; i++)
skills.add(in.readObject());
}
Однако нарушение циклов ссылок немного сложнее. Этот поток предлагает:
Я думаю, что он будет основан на ведении локальной карты потоков.
При сериализации вам нужно найти ваш объект для сериализации, уже находящейся на этой карте ... если это так ... вам нужно сериализовать какой-то заполнитель (например, uuid)
Если его нет в этой карте, сгенерируйте заполнитель, поместите его в эту карту и напишите фактический объект, и вы, вероятно, захотите написать заполнитель, чтобы использовать эту информацию при десериализации.
Я думаю, что это должно поместить вы в правильном направлении, но так как я не реализовал это раньше, я не знаю, есть ли здесь какие-то ошибки.
Хотя приведенное выше предложение имеет смысл, я не совсем уверен, как go о том, как это сделать, т. Е. Какой шаблон разработки программного обеспечения применить и как четко отделить мои сущности от логики сериализации c.
Любые указатели?