2017-05-09 21 views
0

インターフェイスオブジェクトの一覧を持つクラスをシリアル化しようとしています。私は動作させるべき型レジスタを追加しましたが、まだ動作していないので、私は不運です。以下のコード。GSONでインターフェイスを実装するクラスをシリアル化/逆シリアル化できません

ルール:

public interface Rule extends Serializable { 

    public String getName(); 

    public boolean setData(String data); 
    public String getData(); 

} 

RuleAbstract:

public abstract class RuleAbstract implements Rule { 

    private static transient final long serialVersionUID = 1L; 

    public RuleAbstract(){ } 

} 

ActionRule:ActionRuleクラスの

​​

ワン:

public class DoCmd extends RuleAbstract implements ActionRule { 

    private static transient final long serialVersionUID = 1L; 

    private static DoCmd i = new DoCmd(); 
    public static DoCmd get() { return i; } 

    private String cmd; 

    public DoCmd(){ 

    } 

    @Override 
    public void doAction(Player player) { 
     if(this.cmd == null) return; 
     MixinCommand.get().dispatchCommand(player, this.cmd); 
    } 

    @Override 
    public boolean setData(String data) { 
     /** Must start with leading slash */ 
     if(!data.startsWith("/")) return false; 
     this.cmd = data; 
     return true; 
    } 

    @Override 
    public String getData() { 
     return this.cmd; 
    } 

} 

そして最後に、デシリアライズさ&シリアライズされなければなりませんクラス:

public class RuleList { 

    List<Rule> rules = new ArrayList<Rule>(); 

} 

このすべては、私のタイプのアダプタで動作します:

public class AdapterRule implements JsonDeserializer<Rule>, JsonSerializer<Rule> { 

    private static AdapterRule i = new AdapterRule(); 
    public static AdapterRule get() { return i; } 

    @Override 
    public JsonElement serialize(Rule src, Type typeOf, JsonSerializationContext context) { 
     if(src.getData() != null || src.getData() != ""){ 
      return new JsonPrimitive(String.format("%s %s", src.getName(), src.getData())); 
     } 
     return new JsonPrimitive(src.getName()); 
    } 

    @Override 
    public Rule deserialize(JsonElement src, Type typeOf, JsonDeserializationContext context) throws JsonParseException { 
     String splitted[] = src.getAsJsonPrimitive().getAsString().split(" "); 
     if(splitted.length == 1){ 
      return RuleAbstract.getRule(splitted[0]); 
     } else { 
      String tempData = ""; 
      for(String data : splitted){ 
       tempData = tempData + " " + data; 
      } 
      Rule rule = RuleAbstract.getRule(splitted[0]); 
      rule.setData(tempData); 
      return rule; 
     } 
    } 

} 

は、誰かが私が間違ってやっていると指摘してくださいもらえますか?エラー私は受けています:

java.lang.RuntimeException: Unable to invoke no-args constructor for interface some.package.Rule. Register an InstanceCreator with Gson for this type may fix this problem. 
+0

コードが多すぎるとコードの一部が欠落しています。例外は、 'InstanceCreator'を使ってそのサブクラスコンストラクタが登録されていない限り、Gsonがインタフェースをインスタンス化できないことを伝えています。 JSONと完全な例外スタックトレースの両方を提供する方が良いでしょう。 –

+0

@LyubomyrShaydarivどのコードが不足していますか?私は必要なものすべてを提供していると確信しています...完全な例外スタックトレースでできるだけ早く編集します。また、提供されたコードでわかるように、GSONとRuleクラス用のアダプタを追加しましたが、これで動作させるには十分ではないでしょうか? –

+0

宣言されていないシンボルがあります。とにかく。 'DoCmd'が唯一の実装者でない限り、元の型をどこかに置かなければならないので、元の型を復元できるかどうかのヒントがJSONの例です。少なくとも、あなたは 'JsonDeserializer'を登録しましたか? –

答えて

0

をGSONデシリアライザは、直列化復元されるクラス、つまりRuleList上のデフォルトコンストラクタが必要です。

デフォルトコンストラクタを指定できない場合は、デシリアライザに新しいRuleListを提供するInstanceCreatorを登録する必要があります。

+0

Gsonは設計によってコンストラクタを完全に無視します。 –

関連する問題