开发者社区 问答 正文

使用j2cache时报错,急需要解决??报错

使用j2cache时,缓存数据报如下错误,怎么解决?
java.lang.RuntimeException: cannot support legacy JDK serialization methods in crossplatform mode. Define a serializer for this class java.sql.Timestamp
    at org.nustaq.serialization.FSTClazzInfo.<init>(FSTClazzInfo.java:176) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTClazzInfoRegistry.getCLInfo(FSTClazzInfoRegistry.java:129) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.getFstClazzInfo(FSTObjectOutput.java:534) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:416) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectInternal(FSTObjectOutput.java:327) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.serializers.FSTMapSerializer.writeObject(FSTMapSerializer.java:49) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:476) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectInternal(FSTObjectOutput.java:327) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.serializers.FSTCollectionSerializer.writeObject(FSTCollectionSerializer.java:54) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:476) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:369) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectFields(FSTObjectOutput.java:664) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.defaultWriteObject(FSTObjectOutput.java:546) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:458) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObjectInternal(FSTObjectOutput.java:327) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObject(FSTObjectOutput.java:285) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTObjectOutput.writeObject(FSTObjectOutput.java:204) ~[fst-2.57.jar:na]
    at org.nustaq.serialization.FSTConfiguration.asByteArray(FSTConfiguration.java:1182) ~[fst-2.57.jar:na]
    at net.oschina.j2cache.util.FstJSONSerializer.serialize(FstJSONSerializer.java:57) ~[j2cache-core-2.5.1-release.jar:na]
    at net.oschina.j2cache.util.SerializationUtils.serialize(SerializationUtils.java:78) ~[j2cache-core-2.5.1-release.jar:na]
    at net.oschina.j2cache.Level2Cache.put(Level2Cache.java:172) ~[j2cache-core-2.5.1-release.jar:na]
    at net.oschina.j2cache.CacheChannel.set(CacheChannel.java:290) ~[j2cache-core-2.5.1-release.jar:na]
    at net.oschina.j2cache.CacheChannel.set(CacheChannel.java:265) ~[j2cache-core-2.5.1-release.jar:na]

展开
收起
爱吃鱼的程序员 2020-06-08 11:06:05 1214 分享 版权
阿里云 AI 助理回答

遇到这个错误是因为J2Cache在使用FST (Fast Serializing Toolkit) 库进行序列化时,不支持Java的原生JDK序列化方法(即java.sql.Timestamp类),尤其是在跨平台模式下。为了解决这个问题,你需要为java.sql.Timestamp类定义一个自定义的序列化器(Serializer)。

下面是解决步骤:

  1. 创建自定义序列化器:首先,你需要为java.sql.Timestamp创建一个FST兼容的序列化器和反序列化器。这里是一个简单的示例:
import java.io.IOException;
import java.sql.Timestamp;
import org.nustaq.serialization.FSTObjectInput;
import org.nustaq.serialization.FSTObjectOutput;
import org.nustaq.serialization.FSTSerializable;

public class TimestampSerializer implements FSTSerializable {

    @Override
    public void writeObject(FSTObjectOutput out) throws IOException {
        // 将Timestamp转换为long值进行序列化
        out.writeLong(((Timestamp) this).getTime());
    }

    @Override
    public void readObject(FSTObjectInput in) throws IOException, ClassNotFoundException {
        // 从输入流中读取long值并构造Timestamp对象
        long time = in.readLong();
        this.setTime(time); // 注意这里的`this`需要替换为实际的对象实例
    }
}

注意:上述代码中的this.setTime(time)是示意性的,实际上你可能需要创建一个新的Timestamp实例来设置时间。

  1. 注册自定义序列化器:然后,你需要在FST配置中注册你的自定义序列化器。如果你是在Spring环境中使用J2Cache,可以通过配置类来实现这一点:
import net.oschina.j2cache.CacheBuilder;
import net.oschina.j2cache.J2CacheBuilder;
import org.nustaq.serialization.FSTConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class J2CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration();
        // 注册自定义序列化器
        conf.registerSerializer(Timestamp.class, new TimestampSerializer());

        J2CacheBuilder builder = new J2CacheBuilder();
        // 设置其他配置...
        builder.configFromEnv(); // 或者手动配置其他参数
        builder.serializeWith(conf);
        
        return builder.build();
    }
}
  1. 重启应用:完成上述更改后,重新启动你的应用程序,这应该解决了无法序列化java.sql.Timestamp的问题。

请根据你的具体环境调整上述代码片段。如果还有其他类也遇到了类似问题,可以按照同样的方式为它们创建并注册序列化器。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: