Я пытаюсь использовать com.hazelcast.nio.serialization.VersionedPortable для сериализации для класса Customer. Это не поддерживает сериализацию даты по умолчанию. Поэтому нам нужно преобразовать его в Long
@Override
public void writePortable(PortableWriter writer) throws IOException {
if (dob != null) {
Long dobLong = dob.getTime();
writer.writeLong(DOB_FIELD, dobLong);
} else {
writer.writeLong(DOB_FIELD, -1);
}
}
@Override
public void readPortable(PortableReader reader) throws IOException {
if (reader.hasField(DOB_FIELD)) {
Long dobLong = reader.readLong(DOB_FIELD);
dob = dobLong == -1 ? null : new Date(dobLong);
}
}
В CustomerService у меня есть findCustomersByDob, который использует com.hazelcast.query.Predicate.
public Collection<Customer> findCustomersByDob(Date dobStart, Date dobEnd) {
Predicate dobStartPredicate = Predicates.greaterEqual("dob", dobStart);
Predicate dobEndPredicate = Predicates.lessThan("dob", dobEnd);
Predicate andPredicate = Predicates.and(dobStartPredicate, dobEndPredicate);
return idToCustomerMap.values(andPredicate);
}
в idToCustomerMap.values(andPredicate); Я получаю следующее исключение.
Хотя ясно, что исключение связано с этой специальной обработкой даты, я хотел бы знать точную причину преобразования типа здесь. Я читал, что Hazelcast поддерживает данные в сериализованной форме. Так что это не должно быть проблемой, верно?
РЕДАКТИРОВАТЬ: я исправил эту проблему, передав date.getTime() также в предикатах
@vinodhini-chockalingam, @Override
public void writePortable(PortableWriter writer) throws IOException {
if (dob != null) {
Long dobLong = dob.getTime();
writer.writeLong(DOB_FIELD, dobLong);
} else {
writer.writeLong(DOB_FIELD, -1);
}
}
@Override
public void readPortable(PortableReader reader) throws IOException {
if (reader.hasField(DOB_FIELD)) {
Long dobLong = reader.readLong(DOB_FIELD);
dob = dobLong == -1 ? null : new Date(dobLong);
}
}
предназначен для работы с разными языками, а не только с Java. Таким образом, вы можете записать значение из NodeJs и прочитать его из Java с помощью Portable. Вот почему вы не можете напрямую записать объект public Collection<Customer> findCustomersByDob(Date dobStart, Date dobEnd) {
Predicate dobStartPredicate = Predicates.greaterEqual("dob", dobStart);
Predicate dobEndPredicate = Predicates.lessThan("dob", dobEnd);
Predicate andPredicate = Predicates.and(dobStartPredicate, dobEndPredicate);
return idToCustomerMap.values(andPredicate);
}
в Portable. Вам нужно преобразовать его в поддерживаемый тип.
@Override
public void writePortable(PortableWriter writer) throws IOException {
if (dob != null) {
Long dobLong = dob.getTime();
writer.writeLong(DOB_FIELD, dobLong);
} else {
writer.writeLong(DOB_FIELD, -1);
}
}
@Override
public void readPortable(PortableReader reader) throws IOException {
if (reader.hasField(DOB_FIELD)) {
Long dobLong = reader.readLong(DOB_FIELD);
dob = dobLong == -1 ? null : new Date(dobLong);
}
}
public Collection<Customer> findCustomersByDob(Date dobStart, Date dobEnd) {
Predicate dobStartPredicate = Predicates.greaterEqual("dob", dobStart);
Predicate dobEndPredicate = Predicates.lessThan("dob", dobEnd);
Predicate andPredicate = Predicates.and(dobStartPredicate, dobEndPredicate);
return idToCustomerMap.values(andPredicate);
}
Я предполагаю, что это связано с тем, что hazelcast поддерживает данные в сериализованной форме и, следовательно, путается, когда пытается сравнить long с датой в предикате.
public Collection<Customer> findCustomersByDob(Date dobStart, Date dobEnd) {
Predicate dobStartPredicate = Predicates.greaterEqual("dob", dobStart.getTime());
Predicate dobEndPredicate = Predicates.lessThan("dob", dobEnd.getTime());
Predicate andPredicate = Predicates.and(dobStartPredicate, dobEndPredicate);
return idToCustomerMap.values(andPredicate);
}
Тем не менее, этот подход определенно не чище. Есть ли более чистый способ избежать этого в версии Portable?
Кроме того, как мне преодолеть эту проблему?