Мой код выглядит следующим образом:
Сообщение класса ():
import com.google.gson.Gson;
public class Message extends Validatable {
private static final String[] valid_commands = {"EXCHANGEKEY"};
private final String command;
public Message(String command){this.command = command;}
public String getCommand() {return command;}
@Override
public boolean isValid() {
for (String c : valid_commands) {
if(c.equals(this.command))
return true;
}
return false;
}
@Override
public String toString() {return new Gson().toJson(this);}
}
Класс subMessage ():
import java.security.PublicKey;
import java.util.concurrent.ConcurrentHashMap;
public class subMessage extends Message{
private final ConcurrentHashMap<String,PublicKey> keyList;
public ExchangeKeyList(ConcurrentHashMap<String,PublicKey> keyList){
super("EXCHANGEKEY");
this.keyList = keyList;
}
public ConcurrentHashMap<String,PublicKey> getKeyList() {
return keyList;
}
}
Проблема в том, что после использования
gson = new GSON();
и если я установлю
String JSON = gson.toJson(subMessage keyListToJson);
тогда я установил
subMessage keyListFromJson = gson.FromJson(JSON,subMessage.class);
, он вернет ошибку.
Я так растерялся, поскольку keyListToJson здесь является допустимым экземпляром subMessage, он также должен иметь возможность получить действительный экземпляр keyListFromJson. Но это по существу не, я не уверен, почему?
Может кто-нибудь помочь мне, пожалуйста?
Сообщение об ошибке выглядит следующим образом:
java.lang.RuntimeException: Unable to invoke no-args constructor for interface java.security.PublicKey. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$14.construct(ConstructorConstructor.java:226)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
at EZShare.server.WorkerThread.processKeyExchange(WorkerThread.java:411)
at EZShare.server.WorkerThread.reception(WorkerThread.java:127)
at EZShare.server.WorkerThread.run(WorkerThread.java:70)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Причина: java.lang.UnsupportedOperationException: Интерфейс не может быть создан! Имя интерфейса: java.security.PublicKey
на com.google.gson.internal.UnsafeAllocator.assertInstantiable (UnsafeAllocator.java:117)
на com.google.gson.internal.UnsafeAllocator.access $ 000 (UnsafeAllocator.java:31)
на com.google.gson.internal.UnsafeAllocator $ 1.newInstance (UnsafeAllocator.java:49)
на com.google.gson.internal.ConstructorConstructor $ 14.construct (ConstructorConstructor.java:223)
... еще 18