zoukankan      html  css  js  c++  java
  • Java中类对象序列化和反序列化转换大法(精简)

    1.pom.xml中添加相关依赖

    <dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-api</artifactId>
    <version>1.0.10</version>
    </dependency>
    <dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-core</artifactId>
    <version>1.0.10</version>
    </dependency>
    <dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-runtime</artifactId>
    <version>1.0.10</version>
    </dependency>

    2.添加一个自定义工具类
    /**
    * protostuff 序列化工具类,基于protobuf封装
    */
    public class ProtostuffHelper {

    private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();

    private static <T> Schema<T> getSchema(Class<T> clazz) {
    @SuppressWarnings("unchecked")
    Schema<T> schema = (Schema<T>) cachedSchema.get(clazz);
    if (schema == null) {
    schema = RuntimeSchema.getSchema(clazz);
    if (schema != null) {
    cachedSchema.put(clazz, schema);
    }
    }
    return schema;
    }

    /**
    * 序列化
    *
    * @param t
    * @return
    */
    public static <T> byte[] serializer(T t) {
    @SuppressWarnings("unchecked")
    Class<T> clazz = (Class<T>) t.getClass();
    LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
    try {
    Schema<T> schema = getSchema(clazz);
    return ProtostuffIOUtil.toByteArray(t, schema, buffer);
    } catch (Exception e) {
    throw new IllegalStateException(e.getMessage(), e);
    } finally {
    buffer.clear();
    }
    }

    /**
    * 反序列化
    *
    * @param bytes
    * @param clazz
    * @return
    */
    public static <T> T deserializer(byte[] bytes, Class<T> clazz) {
    try {
    T t = clazz.newInstance();
    Schema<T> schema = getSchema(clazz);
    ProtostuffIOUtil.mergeFrom(bytes, t, schema);
    return t;
    } catch (Exception e) {
    throw new IllegalStateException(e.getMessage(), e);
    }
    }

    // 下面举例用法
      @Accessors(chain = true)
      @Builder(toBuilder = true)
      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      @EqualsAndHashCode(callSuper = false)
      @JsonIgnoreProperties(ignoreUnknown = true)
      public static class User{
        String username;
        String password;
      }

    public static void main(String[] args) {
    byte[] bytes = ProtostuffHelper.serializer(User.builder().username("admin").password("admin").build());
    User user = ProtostuffHelper.deserializer(bytes, User.class);
    System.out.println(user);
    }
    }

    搞定,接下来就可以自由使用啦,其转换效率要高于类对象与JSONString互转~
    喜欢秋天温暖的阳光和一杯沁人心脾的下午茶~
  • 相关阅读:
    [cf 947E] Perpetual Subtraction
    loj3120. 「CTS2019 | CTSC2019」珍珠
    loj「LibreOJ NOI Round #2」不等关系
    loj6395. 「THUPC2018」城市地铁规划 / City
    loj2553. 「CTSC2018」暴力写挂
    loj6270. 数据结构板子题
    loj6358. 前夕
    loj6677. EntropyIncreaser 与菱形计数
    fiddler模拟接口响应数据
    Fiddler请求详解/autoResponseder重定向
  • 原文地址:https://www.cnblogs.com/chenyixun/p/15508760.html
Copyright © 2011-2022 走看看