zoukankan      html  css  js  c++  java
  • 分布式开发

    序列化/反序列化 - 实现内存对象 - 二进制数据的转换,二进制数据用于存储、持久化、网络传输。
    技术选型要素:①序列化空间开销(压缩比) ②序列化时间损耗(性能需求) ③是否跨平台 ④使用的难易程度 ⑤是否需要可读性

    Java序列化

    // 序列化对象需实现Serializable接口,可通过transient标签标注属性无需序列化,建议设置序列化UUID
    public class JavaSerializer implements ISerializer {
        public <T> byte[] serialize(T obj) {
            try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
                 ObjectOutputStream oos = new ObjectOutputStream(baos);){
                oos.writeObject(obj);
                return baos.toByteArray();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new byte[0];
        }
    
        public <T> T deserialize(byte[] data) {
            try (ByteArrayInputStream bais = new ByteArrayInputStream(data);
                 ObjectInputStream ois = new ObjectInputStream(bais);){
                return (T)ois.readObject();
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    XML序列化

    // 当前demo采用Xstream组件
    public class XMLSerializer implements ISerializer{
        XStream stream=new XStream(new DomDriver());
        @Override
        public <T> byte[] serialize(T obj) {
            return stream.toXML(obj).getBytes();
        }
    
        @Override
        public <T> T deserialize(byte[] data) {
            return (T)stream.fromXML(new String(data));
        }
    }
    

    Json序列化

    // Fastjson组件,性能最高,但稳定性不如Gson和Jackson
    public class FastjsonSerializer implements ISerializer{
        public <T> byte[] serialize(T obj) {
            return JSON.toJSONBytes(obj);
        }
    
        public <T> T deserialize(byte[] data) {
            return JSON.parseObject(data, User.class);
        }
    }
    

    Hessian序列化

    public class HessianSerializer implements ISerializer{
        @Override
        public <T> byte[] serialize(T obj) {
            try (ByteArrayOutputStream baos = new ByteArrayOutputStream();){
                HessianOutput oos = new HessianOutput(baos);
                oos.writeObject(obj);
                return baos.toByteArray();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return new byte[0];
        }
    
        @Override
        public <T> T deserialize(byte[] data) {
            try (ByteArrayInputStream bais = new ByteArrayInputStream(data);){
                HessianInput ois = new HessianInput(bais);
                return (T)ois.readObject();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    protobuf序列化

    特殊的序列化组件,需要额外的脚本支持(压缩率快而高)

    int压缩算法:zigzag和varint算法

        private static void testProtobufSerializer() throws InvalidProtocolBufferException {
            UserProto.User user = UserProto.User.newBuilder().setName("kiqi").setAge(18).setStatus(-200).build();
            byte[] bytes = user.toByteArray();
            System.out.println(Arrays.toString(bytes));
    
            UserProto.User userRever = UserProto.User.parseFrom(bytes);
            System.out.println(userRever.toString());
        }
    

    欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友

    -- 星河有灿灿,愿与之辉

  • 相关阅读:
    移动混合开发
    H5嵌入APP后,原生APP与H5之间交互
    移动混合开发的 JSBridge
    CSS3中transition和animation区别的理解
    git 回滚到指定版本并推送到远程分支
    李刘玉前端开发简历
    vue+axios 前端实现登录拦截(路由拦截、http拦截)
    移动端bug
    隐藏滚动条
    flex布局中子元素宽度失效的问题
  • 原文地址:https://www.cnblogs.com/kiqi/p/14428749.html
Copyright © 2011-2022 走看看