首页 > 其他分享 >序列化器---netty

序列化器---netty

时间:2022-10-21 16:37:48浏览次数:62  
标签:netty return Class --- json new 序列化 public

package cn.itcast.protocol;

import com.google.gson.*;

import java.io.*;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;

/**
 * 用于扩展序列化、反序列化算法
 */
public interface Serializer {

    // 反序列化方法
    <T> T deserialize(Class<T> clazz, byte[] bytes);

    // 序列化方法
    <T> byte[] serialize(T object);

    enum Algorithm implements Serializer {

        Java {
            @Override
            public <T> T deserialize(Class<T> clazz, byte[] bytes) {
                try {
                    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
                    return (T) ois.readObject();
                } catch (IOException | ClassNotFoundException e) {
                    throw new RuntimeException("反序列化失败", e);
                }
            }

            @Override
            public <T> byte[] serialize(T object) {
                try {
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    ObjectOutputStream oos = new ObjectOutputStream(bos);
                    oos.writeObject(object);
                    return bos.toByteArray();
                } catch (IOException e) {
                    throw new RuntimeException("序列化失败", e);
                }
            }
        },

        Json {
            @Override
            public <T> T deserialize(Class<T> clazz, byte[] bytes) {
                Gson gson = new GsonBuilder().registerTypeAdapter(Class.class, new Serializer.ClassCodec()).create();
                String json = new String(bytes, StandardCharsets.UTF_8);
                return gson.fromJson(json, clazz);
            }

            @Override
            public <T> byte[] serialize(T object) {
                Gson gson = new GsonBuilder().registerTypeAdapter(Class.class, new Serializer.ClassCodec()).create();
                String json = gson.toJson(object);
                return json.getBytes(StandardCharsets.UTF_8);
            }
        }
    }
    class ClassCodec implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>> {

        @Override
        public Class<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try {
                String str = json.getAsString();
                return Class.forName(str);
            } catch (ClassNotFoundException e) {
                throw new JsonParseException(e);
            }
        }

        @Override             //   String.class
        public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) {
            // class -> json
            return new JsonPrimitive(src.getName());
        }
    }
}

 

标签:netty,return,Class,---,json,new,序列化,public
From: https://www.cnblogs.com/yolinzhao2/p/16813875.html

相关文章

  • HTML标签-列表标签和HTML标签-链接标签
    HTML标签-列表标签案例:旅游网站首页1.确定使用table来完成布局2.如果某一行只有一个单元格,则使用<tr><td></td></tr>3.如果某一行有多个单元格,则使用<tr>......
  • vue-code-diff 实现版本对比,带内容覆盖(仅组件,待完善内容解析)
    <template><divclass="version-diff-content"><divclass="version-diff-top"><div><el-selectv-model="versionDiffSelected.selectOne.versi......
  • SpringBoot集成Bootstrap-Swagger-ui,现在叫knife4j,功能更强大
    离线文档格式很全面  集成方式1、添加maven<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactI......
  • MasaFramework -- 缓存入门与规则配置
    概念什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有:本地缓存内存缓存:IMemoryCache分布式缓存Redis:......
  • python抓取Prometheus的数据(使用prometheus-api-client库)
    python抓取Prometheus的数据(使用prometheus-api-client库)0、写在前面我们要想抓取Prometheus的数据,一般想到的就是requests请求,爬虫的方式来抓取,这是可行的,当然,还有一个......
  • 结构型模式-外观模式
    概述有些人可能超过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果找个懂行的帮帮手就好,其实基金就是个好帮......
  • C#------主线程和子线程如何实现互相传递数据
    主线程和子线程如何实现互相传递数据在C#中创建线程Thread时,可以有多种方法,而主线程和子线程之间又如何实现互相传递数据,每种创建方法传递参数的效果是不同的,逐一看一下:......
  • React学习--路由不跳转
    在配置React路由的时候遇到的问题,url跳转了但是页面没有跟着刷新,找了很久没找到问题最后想了想可能是因为index.js的<React.StrictMode>导致的,注释之后就成功了......
  • 牛客SQL-employees表(一):195-220
    195.查找employees里最晚入职员工的所有信息SELECT*FROMemployeesWHEREhire_date=(SELECTMAX(hire_date)FROMemployees)/*#如果员工入职的日期都不是同一......
  • 牛客SQ-actor表:223-232
    223.使用join查询方式找出没有分类的电影id以及其电影名称SELECTfilm_id,titleFROMfilmt1LEFTJOINfilm_categoryt3USING(film_id)WHEREcategory_idISNULL......