gpt4 book ai didi

java - 当包含泛型类型时,如何通过 Hazelcast DataSerializable 序列化 Java 类?

转载 作者:行者123 更新时间:2023-12-05 07:51:34 25 4
gpt4 key购买 nike

你能告诉我我做错了什么吗?我真的很难为 Hazelcast 实现更高效的序列化程序。我有以下 Java 类:

public class Tuple<X, Y> implements DataSerializable
{
public X x;
public Y y;

private Tuple()
{
}

public Tuple(X x, Y y)
{
this.x = x;
this.y = y;
}

@Override
public void readData(ObjectDataInput in)
throws IOException {
Instance.log("read data");
this.x = (X)in.readObject();
this.y = (Y)in.readObject();
}

@Override
public void writeData(ObjectDataOutput out)
throws IOException {
Instance.log("write data");
out.writeObject(this.x);
out.writeObject(this.y);
}

}

我是这样使用它的:

HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
IMap<String, Set<Tuple<Integer, Double>>> myMap = Hazelcast.getMap("myMap");

但是,每当我尝试使用此映射(除了实现可序列化,该方案工作正常)时,我都会返回此异常:

com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.NotSerializableException: Tuple

我在这里做错了什么?感谢任何想法,感谢一百万!

更新

尝试了这个建议(感谢 noctarius),我现在有了这个:

public class TupleSetStreamSerializer
implements StreamSerializer<Set<Tuple>> {

@Override
public int getTypeId () {
return SerializationIdentifiers.TupleSerializationFactoryId;
}

@Override
public void write(ObjectDataOutput out, final Set<Tuple> set )
throws IOException {
int size = set == null ? 0 : set.size();
Instance.log("Serialize set");
out.writeInt(size);
if (size>0) {
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
out.writeObject(iterator.next());
}
}
}

@Override
public Set<Tuple> read( ObjectDataInput in )
throws IOException {

Instance.log("Deserialize set");
int size = in.readInt();
Set result = null;
if (size > 0) {
result = new HashSet<Tuple>();
for (int i = 0; i < size; i++) {
result.add(in.readObject());
}
}
return result;
}

@Override
public void destroy () {
}
}

还有这个

public class TupleStreamSerializer
implements StreamSerializer<Tuple> {

@Override
public int getTypeId () {
return SerializationIdentifiers.TupleSerializationFactoryId;
}

@Override
public void write(ObjectDataOutput out, Tuple tup )
throws IOException {
out.writeObject(tup.x);
out.writeObject(tup.y);
}

@Override
public Tuple read( ObjectDataInput in )
throws IOException {
Object x = in.readObject();
Object y = in.readObject();
return new Tuple(x,y);
}

@Override
public void destroy () {
}
}

使用这样的配置(尝试评论各种变体和所有)

<hazelcast>
<serialization>
<serializers>
<serializer type-class="Tuple">TupleStreamSerializer</serializer>
<serializer type-class="Set<Tuple>">TupleSetStreamSerializer</serializer>
</serializers>
</serialization>
</hazelcast>

我好像还漏了什么?非常感谢!

最佳答案

您必须为 Set 接口(interface)编写一个特殊的 StreamSerializer。每当 Hazelcast 开始序列化一个 Serializable 标记的类时,它就会失去序列化控制。有一些解决方法,但它们都不是很好。最好的方法是使用 Serializable 拦截 Set 的序列化并提供自定义序列化程序:http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html#streamserializer

您将在 Hazelcast 核心代码中找到 LinkedList 类型的示例:https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java/com/hazelcast/internal/serialization/impl/LinkedListStreamSerializer.java

关于java - 当包含泛型类型时,如何通过 Hazelcast DataSerializable 序列化 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com