您可以使 Blob 瞬态,然后它不会被序列化,但在反序列化时它将为空:
private transient Blob data;
我认为您唯一的其他选择是为 blob 创建一个单独的对象,并仅在 RawDataEntity 中引用它,并使用 LoadableDetachableModel 根据请求重新加载它。
public class BlobModel extends LoadableDetachableModel<Blob> {
private int id;
public BlobModel(int id) {
this.id = id;
}
@Override
protected Blob load() {
return dao.getObject(id);
}
}
另一个选项是更改无法序列化的页面的序列化。首先为这些页面创建一个界面:
public interface CustomSerialize {
Serializable getSerializable(Object object);
Object getUnserializable(Object object);
}
接下来创建你自己的序列化器:
public class CustomSerializer extends JavaSerializer {
public CustomSerializer(String applicationKey) {
super(applicationKey);
}
@Override
public byte[] serialize(Object object) {
if (object instanceof CustomSerialize) {
super.serialize(((CustomSerialize) object).getSerializable(object));
}
return super.serialize(object);
}
@Override
public Object deserialize(byte[] data) {
Object object = super.deserialize(data);
if (object instanceof CustomSerialize) {
return ((CustomSerialize) object).getUnserializable(object);
}
return object;
}
}
然后在无法序列化的页面上实现该接口并编写这两个方法。 getSerializable() 应该创建一个实现 CustomSerializer 的对象,以便 getUnserializable() 返回相同的页面。
最后,在您的 wicket WebApplication 中使用新的序列化程序:
getFrameworkSettings().setSerializer(new CustomSerializer(getApplicationKey()));