ClassNotFoundException when deserializing a binary class file's contents

前端 未结 7 1781
[愿得一人]
[愿得一人] 2021-01-12 16:32

I don\'t know much about Java. I\'m trying to read a file containing an int and various instances of a class called \"Automobile\". When I deserialize it, though, the progra

7条回答
  •  青春惊慌失措
    2021-01-12 16:42

    This is and old question but this may help someone else. I faced the same issue and the problem was that I was not using the current thread class loader. You will find below the serializer class that I used in a grails project, should be quite straightforward use this in java Hope this helps

    public final class Serializer {
    
    /**
     * Converts an Object to a byte array.
     *
     * @param object, the Object to serialize.
     * @return, the byte array that stores the serialized object.
     */
    
    public static byte[] serialize(T object) {
    
        ByteArrayOutputStream bos = new ByteArrayOutputStream()
        ObjectOutput out = null
        try {
            out = new ObjectOutputStream(bos)
            out.writeObject(object)
    
            byte[] byteArray = bos.toByteArray()
            return byteArray
    
        } catch (IOException e) {
            e.printStackTrace()
            return null
    
        } finally {
            try {
                if (out != null)
                    out.close()
            } catch (IOException ex) {
                ex.printStackTrace()
                return null
            }
            try {
                bos.close()
            } catch (IOException ex) {
                ex.printStackTrace()
                return null
            }
        }
    
    }
    
    /**
     * Converts a byte array to an Object.
     *
     * @param byteArray, a byte array that represents a serialized Object.
     * @return, an instance of the Object class.
     */
    public static Object deserialize(byte[] byteArray) {
        ByteArrayInputStream bis = new ByteArrayInputStream(byteArray)
        ObjectInput input = null
        try {
            input = new ObjectInputStream(bis){
                @Override protected Class resolveClass(final ObjectStreamClass desc) throws IOException, ClassNotFoundException {
                    ClassLoader cl = Thread.currentThread().getContextClassLoader();
                    if (cl == null)  return super.resolveClass(desc);
                    return Class.forName(desc.getName(), false, cl);
                }
            };
            Object o = input.readObject()
            return o
    
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace()
            return null
        } finally {
            try {
                bis.close()
            } catch (IOException ex) {
            }
            try {
                if (input != null)
                    input.close()
            } catch (IOException ex) {
                ex.printStackTrace()
                return null
            }
        }
    }
    

提交回复
热议问题