Java 无法反序列化多值dhashmap<;字符串,字符串>;在爪哇

Java 无法反序列化多值dhashmap<;字符串,字符串>;在爪哇,java,serialization,deserialization,Java,Serialization,Deserialization,我正在尝试反序列化javax.ws.rs.core.MultivaluedHashMap MultivaluedHashMap实现java.io.Serializable,并具有一个公共的无参数构造函数 但是,当反序列化以前序列化的多值DhashMap时,会引发InvalidClassException(无有效构造函数): 线程“main”org.apache.commons.lang3.SerializationException中的异常:java.io.InvalidClassExcepti

我正在尝试反序列化javax.ws.rs.core.MultivaluedHashMap

MultivaluedHashMap实现java.io.Serializable,并具有一个公共的无参数构造函数

但是,当反序列化以前序列化的多值DhashMap时,会引发InvalidClassException(无有效构造函数):

线程“main”org.apache.commons.lang3.SerializationException中的异常:java.io.InvalidClassException:javax.ws.rs.core.MultivaluedHashMap;没有有效的构造函数 位于org.apache.commons.lang3.SerializationUtils.deserialize(SerializationUtils.java:231) 位于org.apache.commons.lang3.SerializationUtils.deserialize(SerializationUtils.java:267) 位于org.arx.serializationtest.Main.Main(Main.java:17) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:497) 位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 原因:java.io.InvalidClassException:javax.ws.rs.core.MultivaluedHashMap;没有有效的构造函数 位于java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150) 在java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:768) 位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1775) 位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 位于java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993) 位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918) 位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801) 位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 位于org.apache.commons.lang3.SerializationUtils.deserialize(SerializationUtils.java:223) ... 还有7个

通过运行下面简单的3行长的主方法,可以很容易地再现这一点:

package test;

import org.apache.commons.lang3.SerializationUtils;
import javax.ws.rs.core.MultivaluedHashMap;

public class Test {
    public static void main(String[] args) throws Exception {

        MultivaluedHashMap<String, String> map = new MultivaluedHashMap<String, String>();
        byte[] serializedMap = SerializationUtils.serialize(map);

        MultivaluedHashMap<String, String> deserializedMap = SerializationUtils.deserialize(serializedMap);
    }
}
封装测试;
导入org.apache.commons.lang3.SerializationUtils;
导入javax.ws.rs.core.MultivaluedHashMap;
公开课考试{
公共静态void main(字符串[]args)引发异常{
多值DhashMap=新的多值DhashMap();
字节[]serializedMap=SerializationUtils.serialize(映射);
MultivaluedHashMap deserializedMap=SerializationUtils.deserialize(serializedMap);
}
}
从那里我不知道如何解决这个问题。如有任何建议或指示,将不胜感激


提前感谢您的帮助。

反序列化
多值dhashmap
所需的类之一似乎没有无参数构造函数。您可以这样做:

MultivaluedHashMap<String, String> map = new MultivaluedHashMap<String, String>();
HashMap<String, List<String>> serMap = new HashMap<String, List<String>>(map);
byte[] serializedMap = SerializationUtils.serialize(serMap);

HashMap<String, List<String>> tempMap = SerializationUtils.deserialize(serializedMap);
MultivaluedHashMap<String, String> deserializedMap = new MultivaluedHashMap<String, String>();
for (Entry<String, List<String>> entry : tempMap.entrySet()) {
    deserializedMap.put(entry.getKey(), entry.getValue());
}
MultivaluedHashMap=新的MultivaluedHashMap();
HashMap serMap=新的HashMap(map);
字节[]serializedMap=SerializationUtils.serialize(serMap);
HashMap tempMap=SerializationUtils.deserialize(serializedMap);
MultivaluedHashMap反序列化dmap=新的MultivaluedHashMap();
for(条目:tempMap.entrySet()){
反序列化map.put(entry.getKey(),entry.getValue());
}

这样做的目的是创建一个
HashMap
,它将保存重建原始
MultivaluedHashMap
所需的所有值,并对该
HashMap
进行序列化/反序列化,而不是
MultivaluedHashMap

,这是因为MultivaluedHashMap没有实现Serializable。要解决此问题,请执行以下操作:

import java.io.Serializable;
导入javax.ws.rs.core.MultivaluedHashMap;
公共类MyMultivaluedHashMap扩展了MultivaluedHashMap,实现了序列化{
私有静态最终长serialVersionUID=1L;
公共MyMultivaluedHashMap(){
超级();
//还有其他的超级班
}
}
//你的代码
导入javax.ws.rs.core.MultivaluedHashMap;
导入org.apache.commons.lang3.SerializationUtils;
公共类测试{
公共Teste(){}
公共静态void main(字符串[]args)引发异常{
MyMultivaluedHashMap=新的MyMultivaluedHashMap();
地图。addFirst(“键-1”,“胖乎乎的”);
地图。添加(“键2”,“瘦”);
字节[]serializedMap=SerializationUtils.serialize(映射);
System.out.println(序列化dmap);
MultivaluedHashMap deserializedMap=SerializationUtils.deserialize(serializedMap);
System.out.println(反序列化的dmap);
}

}
实际上
MultivaluedHashMap
实现了
Serializable
您可以在Ok中看到,如果您的版本实现了Serializable,但我看到有一个版本没有实现。谢谢@MarceloFerreira,尽管Titus是对的,但MultivaluedHashMap的最新版本实现了Serializable。谢谢Titus,为了解决这个问题,我用一个映射替换了多值dhashmap。