apache / incubator-fury

A blazingly fast multi-language serialization framework powered by JIT and zero-copy.

Home Page:https://fury.apache.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

【JAVA】deserialize class not found USE withRefTracking(true).requireClassRegistration(false).withCompatibleMode(CompatibleMode.COMPATIBLE).buildThreadSafeFury()

weijiang157152688 opened this issue · comments

commented

Search before asking

  • I had searched in the issues and found no similar issues.

Version

Version: 0.5.0 (built from source)
OS: macOS

Component(s)

Java

Minimal reproduce step

package alsc.ele.lpd.dispatch.matrix.service.tt;

import alsc.ele.lpd.dispatch.matrix.service.dto.AssignDetailInfoLog;
import alsc.ele.lpd.dispatch.matrix.service.dto.AssignType;
import alsc.ele.lpd.dispatch.matrix.service.util.FuryUtils;
import me.ele.lpd.dispatch.matrix.score.infra.config.CompressEnum;
import me.ele.lpd.dispatch.matrix.score.infra.utils.CompressObjectUtils;
import me.ele.lpd.dispatch.matrix.score.infra.utils.Lz4Util;
import org.xerial.snappy.Snappy;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;

public class Test {


    public static void main(String[] args) throws IOException {

        // read
        read();

//        write();

    }

    public static void write() throws IOException {
        AssignDetailInfoLog assignDetailInfoLog = new AssignDetailInfoLog();
        assignDetailInfoLog.setType(AssignType.DEFAULT);
        assignDetailInfoLog.setId("dsa");
        byte[] data = FuryUtils.serialize(assignDetailInfoLog);
        saveToFile("test_file", data);
    }

    public static void read() throws IOException {

        // read
        byte[] data = readFileToBytes("test_file");
        FuryUtils.zeroCopyDeserialize(data);

    }

    public static void saveToFile(String fileName, byte[] data) {
        try (FileOutputStream outputStream = new FileOutputStream(fileName)) {
            outputStream.write(data);  // 写入byte[]
            System.out.println("Data has been written to " + fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static byte[] readFileToBytes(String filePath) {
        try {
            return Files.readAllBytes(new File(filePath).toPath());
        } catch (Exception e) {
            return null;
        }
    }
}

package alsc.ele.lpd.dispatch.matrix.service.dto;

import lombok.Data;

@Data
public class AssignDetailInfoLog {
    String id;
    AssignType  type;

}


package alsc.ele.lpd.dispatch.matrix.service.dto;

public enum AssignType {
    DEFAULT;
}


package alsc.ele.lpd.dispatch.matrix.service.util;

import org.apache.fury.Fury;
import org.apache.fury.ThreadSafeFury;
import org.apache.fury.config.CompatibleMode;
import org.apache.fury.logging.LoggerFactory;

import java.nio.ByteBuffer;

public class FuryUtils {
    private static final ThreadSafeFury fury;

    public FuryUtils() {
    }

    public static <T> byte[] serialize(T t) {
        return fury.serialize(t);
    }

    public static Object zeroCopyDeserialize(byte[] byteBuffer) {
        return fury.deserialize(byteBuffer);
    }

    public static Object zeroCopyDeserialize(ByteBuffer byteBuffer) {
        return fury.deserialize(byteBuffer);
    }

    static {
        fury = Fury.builder().withRefTracking(true).requireClassRegistration(false).withCompatibleMode(CompatibleMode.COMPATIBLE).buildThreadSafeFury();
        LoggerFactory.disableLogging();
    }
}

What did you expect to see?

deserialize

What did you see instead?

After deleting the AssignType file, an error occurred.

Deserialize failed, read objects are: [AssignDetailInfoLog(id=dsa), null]
at org.apache.fury.Fury.handleReadFailed(Fury.java:788)
at org.apache.fury.Fury.deserialize(Fury.java:750)
at org.apache.fury.Fury.deserialize(Fury.java:676)
at org.apache.fury.ThreadLocalFury.deserialize(ThreadLocalFury.java:130)
at alsc.ele.lpd.dispatch.matrix.service.util.FuryUtils.zeroCopyDeserialize(FuryUtils.java:21)
at alsc.ele.lpd.dispatch.matrix.service.tt.Test.main(Test.java:30)
Caused by: java.lang.IllegalStateException: Class alsc.ele.lpd.dispatch.matrix.service.dto.AssignType not found from classloaders [sun.misc.Launcher$AppClassLoader@18b4aac2, sun.misc.Launcher$AppClassLoader@18b4aac2]
at org.apache.fury.resolver.ClassResolver.loadClass(ClassResolver.java:1688)
at org.apache.fury.resolver.ClassResolver.loadBytesToClass(ClassResolver.java:1636)

Anything Else?

deserialize

Are you willing to submit a PR?

  • I'm willing to submit a PR!

I can run this successfully locally:
image

Here is my code:

package org.apache.fury;

import lombok.Data;
import org.apache.fury.config.CompatibleMode;
import org.apache.fury.logging.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;

public class Test {
  @Data
  public static class AssignDetailInfoLog {
    String id;
    AssignType  type;

  }



  public enum AssignType {
    DEFAULT;
  }



  public static class FuryUtils {
    private static final ThreadSafeFury fury;

    public FuryUtils() {
    }

    public static <T> byte[] serialize(T t) {
      return fury.serialize(t);
    }

    public static Object zeroCopyDeserialize(byte[] byteBuffer) {
      return fury.deserialize(byteBuffer);
    }

    public static Object zeroCopyDeserialize(ByteBuffer byteBuffer) {
      return fury.deserialize(byteBuffer);
    }

    static {
      fury = Fury.builder().withRefTracking(true).requireClassRegistration(false).withCompatibleMode(CompatibleMode.COMPATIBLE).buildThreadSafeFury();
      LoggerFactory.disableLogging();
    }
  }

  public static void main(String[] args) throws IOException {

    // read
    read();

//        write();

  }

  public static void write() throws IOException {
    AssignDetailInfoLog assignDetailInfoLog = new AssignDetailInfoLog();
    assignDetailInfoLog.setType(AssignType.DEFAULT);
    assignDetailInfoLog.setId("dsa");
    byte[] data = FuryUtils.serialize(assignDetailInfoLog);
    saveToFile("test_file", data);
  }

  public static void read() throws IOException {
    write();
    // read
    byte[] data = readFileToBytes("test_file");
    FuryUtils.zeroCopyDeserialize(data);

  }

  public static void saveToFile(String fileName, byte[] data) {
    try (FileOutputStream outputStream = new FileOutputStream(fileName)) {
      outputStream.write(data);  // 写入byte[]
      System.out.println("Data has been written to " + fileName);
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

  public static byte[] readFileToBytes(String filePath) {
    try {
      return Files.readAllBytes(new File(filePath).toPath());
    } catch (Exception e) {
      return null;
    }
  }
}