2015-02-24 32 views
1

鉴于以下结构:递归型适配器GSON

abstract class Message { 
    Message anotherMessage; 
    String attribute; //just random stuff 
} 

我想有以下JSON字符串作为输出:

{type=Class.getSimpleName(), data=gson(Message)} 

作为消息是抽象的,并且可以具有多个实现。问题是,“anotherMessage”不会有结构类型,数据。

我实现序列化的:

public JsonElement serialize(final Message src, final Type typeOfSrc, 
    final JsonSerializationContext context) { 
    Gson gson = new Gson(); 
    JsonObject elem = new JsonObject(); 
    elem.addProperty("type", src != null ? src.getClass().getSimpleName() : null); 
    elem.addProperty("data", src != null ? gson.toJson(src) : null); 
    return elem; 
} 

我怎样才能做到这一点递归?我无法获得带有已附加消息适配器的Gson对象(stackoverflow-exception)

回答

1

在序列化/反序列化过程中,可以使用JsonSerializationContext/JsonDeserializationContext来序列化/反序列化另一个对象。

Message.java

abstract class Message { 
    Message anotherMessage; 
    String theMessage; 

    public Message getAnotherMessage() { 
     return anotherMessage; 
    } 

    public String getTheMessage() { 
     return theMessage; 
    } 
} 

Info.java

public class InfoMessage extends Message { 
    public InfoMessage(Message anotherMessage, String theMessage) { 
     this.anotherMessage = anotherMessage; 
     this.theMessage = theMessage; 
    } 
} 

Alert.java

public class AlertMessage extends Message { 
    public AlertMessage(Message anotherMessage, String theMessage) { 
     this.anotherMessage = anotherMessage; 
     this.theMessage = theMessage; 
    } 
} 

ErrorMessage.java

public class ErrorMessage extends Message { 
    public ErrorMessage(Message anotherMessage, String theMessage) { 
     this.anotherMessage = anotherMessage; 
     this.theMessage = theMessage; 
    } 
} 

MessageSerializer.java

public JsonElement serialize(Message src, Type typeOfSrc, JsonSerializationContext context) { 
    JsonObject elem = new JsonObject(); 

    if (src == null) { 

    } else { 
     elem.addProperty("type", src.getClass().getSimpleName()); 
     elem.addProperty("attribute", src.getTheMessage()); 
     elem.add("data", src.anotherMessage != null ? context.serialize(src.anotherMessage, Message.class): null); 
    } 

    return elem; 
} 

Test.java

public static void main(String[] args) { 
     Gson gson = new GsonBuilder() 
          .registerTypeAdapter(Message.class, new MessageSerializer()) 
          .setPrettyPrinting() 
          .create(); 

     String json = gson.toJson(
          new InfoMessage(
            new AlertMessage(
              new ErrorMessage(null, "the error message"), 
              "the alert message"), 
            "the info message"), 
          Message.class); 
     System.out.println(json); 

}