使用设计模式的JavaGSON-Json序列化程序和反序列化程序?

使用设计模式的JavaGSON-Json序列化程序和反序列化程序?,java,json,design-patterns,project-structure,Java,Json,Design Patterns,Project Structure,我正在开发桌面音乐播放器应用程序。我已经决定将所有关于歌曲、音乐播放列表等的必要信息存储在json文件中 public class Library { private static File libFile; private static SongList songList; private static List<Album> albumList; private static List<Artist> artistList;

我正在开发桌面音乐播放器应用程序。我已经决定将所有关于歌曲、音乐播放列表等的必要信息存储在json文件中

public class Library {

    private static File libFile;
    private static SongList songList;
    private static List<Album> albumList;
    private static List<Artist> artistList;
    private static List<Playlist> playlistList;
    ...
}
我有一个类库,它通常负责准备歌曲和处理json文件

public class Library {

    private static File libFile;
    private static SongList songList;
    private static List<Album> albumList;
    private static List<Artist> artistList;
    private static List<Playlist> playlistList;
    ...
}
有两种主要方法负责处理文件:Library.load()和Library.save()。 例如,“保存方法”使用两种方法来保存相册、播放列表或艺术家收藏,如下所示:

private static <T extends SongList> JsonElement parseSongList(List<T> list) {

    GsonBuilder customGsonBuilder = new GsonBuilder();

    //Custom serializer for songlist (id only)
    JsonSerializer <SongList> playlistSerializer = new JsonSerializer<SongList>(){
        @Override
        public JsonElement serialize(SongList src, Type type, JsonSerializationContext context) {
            JsonArray ids = new JsonArray();
            for(Song song : src.get()) {
                ids.add(song.getId());
            }
            return ids;
        };
    };


    //Custom serializer for albums
    JsonSerializer <Album> albumSerializer = new JsonSerializer<Album>() {
        @Override
        public JsonElement serialize(Album src, Type type, JsonSerializationContext context) {
            JsonObject result = new JsonObject();
            result.addProperty("id", src.getId());
            result.addProperty("artist", src.getArtist().get());
            result.addProperty("release.year", src.getReleaseYear());
            result.addProperty("length.in.seconds", src.getLengthInSeconds());

            JsonArray ids = (JsonArray) playlistSerializer.serialize(src, type, context);
            result.add("songs", ids);
            return result;
        }
    };

    //Selecting type adapter
    if(!list.isEmpty()) {
        SongList tmp = list.get(0);
        if(tmp instanceof Playlist) {
            customGsonBuilder.registerTypeAdapter(Playlist.class, playlistSerializer);
        }else if(tmp instanceof Album) {
            customGsonBuilder.registerTypeAdapter(Album.class, albumSerializer);
        }
    }else {
        return null;
    }

    Gson customGson = customGsonBuilder.setPrettyPrinting().create();

    //serializing
    JsonObject songs = new JsonObject();
    for(SongList songlist : list) {
        songs.add(songlist.getTitle(), customGson.toJsonTree(songlist));
    }

    return songs;

}
私有静态JsonElement parseSongList(列表){
GsonBuilder customGsonBuilder=新的GsonBuilder();
//歌曲列表的自定义序列化程序(仅id)
JsonSerializer playlisserializer=新的JsonSerializer(){
@凌驾
公共JsonElement序列化(歌曲列表src,类型类型,JsonSerializationContext){
JsonArray id=新的JsonArray();
for(歌曲:src.get()){
add(song.getId());
}
返回ID;
};
};
//相册的自定义序列化程序
JsonSerializer albumSerializer=新的JsonSerializer(){
@凌驾
公共JsonElement序列化(相册src、类型Type、JsonSerializationContext){
JsonObject结果=新建JsonObject();
result.addProperty(“id”,src.getId());
result.addProperty(“artist”,src.getArtist().get());
result.addProperty(“release.year”,src.getReleaseYear());
addProperty(“length.in.seconds”,src.getLengthInSeconds());
JsonArray id=(JsonArray)playlisserializer.serialize(src,type,context);
结果。添加(“歌曲”,ID);
返回结果;
}
};
//选择类型适配器
如果(!list.isEmpty()){
歌曲列表tmp=list.get(0);
if(播放列表的tmp实例){
customGsonBuilder.registerTypeAdapter(Playlist.class,playlisterizer);
}else if(相册的tmp实例){
customGsonBuilder.registerTypeAdapter(Album.class,albumSerializer);
}
}否则{
返回null;
}
Gson customGson=customGsonBuilder.setPrettyPrinting().create();
//连载
JsonObject歌曲=新的JsonObject();
for(歌曲列表歌曲列表:列表){
add(songlist.getTitle(),customGson.toJsonTree(songlist));
}
返回歌曲;
}
正如你所看到的,这是混乱的(我认为),甚至不是最混乱的一个。load/save使用的每个方法都为不同的结构提供了不同的序列化程序和反序列化程序

我想在图书馆课上做“一般性清理”,这样就很容易阅读、维护,并确保如果需要,我可以轻松添加更多的音乐结构或功能

以下是我的问题:

  • 每个歌曲列表、播放列表、唱片集或艺术家对象都可以归结为
    LinkedList
    ——是否有任何首选的方法来序列化和反序列化这些结构,或者这并不重要?我应该为歌曲列表/专辑/艺术家或
    列表
    提供序列化器和反序列化器吗

  • 我想在一个模块(类/包或其他)中包含所有直接负责序列化/反序列化的对象、方法、类等。我从未使用过,但有没有适合我的应用程序的设计模式(工厂方法?)。如果是的话,我将非常感谢为我提供一些总体计划(或指南链接),我应该遵循这些计划来实施

  • 有关于图书馆结构的总体建议吗


  • 欢迎对代码/项目结构提出任何其他建议,可能存在许多问题。

    如果您的代码已经运行,您应该将其发布在,但一定要先阅读它们。如果您的代码已经运行,您应该将其发布在,但一定要先阅读它们。
    private static <T extends SongList> JsonElement parseSongList(List<T> list) {
    
        GsonBuilder customGsonBuilder = new GsonBuilder();
    
        //Custom serializer for songlist (id only)
        JsonSerializer <SongList> playlistSerializer = new JsonSerializer<SongList>(){
            @Override
            public JsonElement serialize(SongList src, Type type, JsonSerializationContext context) {
                JsonArray ids = new JsonArray();
                for(Song song : src.get()) {
                    ids.add(song.getId());
                }
                return ids;
            };
        };
    
    
        //Custom serializer for albums
        JsonSerializer <Album> albumSerializer = new JsonSerializer<Album>() {
            @Override
            public JsonElement serialize(Album src, Type type, JsonSerializationContext context) {
                JsonObject result = new JsonObject();
                result.addProperty("id", src.getId());
                result.addProperty("artist", src.getArtist().get());
                result.addProperty("release.year", src.getReleaseYear());
                result.addProperty("length.in.seconds", src.getLengthInSeconds());
    
                JsonArray ids = (JsonArray) playlistSerializer.serialize(src, type, context);
                result.add("songs", ids);
                return result;
            }
        };
    
        //Selecting type adapter
        if(!list.isEmpty()) {
            SongList tmp = list.get(0);
            if(tmp instanceof Playlist) {
                customGsonBuilder.registerTypeAdapter(Playlist.class, playlistSerializer);
            }else if(tmp instanceof Album) {
                customGsonBuilder.registerTypeAdapter(Album.class, albumSerializer);
            }
        }else {
            return null;
        }
    
        Gson customGson = customGsonBuilder.setPrettyPrinting().create();
    
        //serializing
        JsonObject songs = new JsonObject();
        for(SongList songlist : list) {
            songs.add(songlist.getTitle(), customGson.toJsonTree(songlist));
        }
    
        return songs;
    
    }