美文网首页Java服务端面试
序列化和反序列化

序列化和反序列化

作者: 匠丶 | 来源:发表于2018-08-20 23:42 被阅读5152次

什么是序列化和反序列化

序列化是指将数据结构或者对象转换成二进制串的过程;反序列化则是将二进制串转换成数据结构和对象。
序列化和反序列化主要用网络通讯过程,对应TCP/IP协议的应用层、OSI七层模型的表现层,将应用层的数据转换成二进制进行传输。

Java序列化

  • 实现方式
    对于要序列化的对象,实现Serializable或者Externalizable接口。通过ObjectInputStream 和 ObjectOutputStream进行序列化和反序列化。
public class Person implements Serializable {
    private String name;

    //加入关键字,不会被序列化
    private transient int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.writeObject(name);
        out.writeInt(age);
    }
    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        this.name=(String) in.readObject();
        this.age = in.readInt();
    }
}

 public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person();
        person.setName("Jay");
        person.setAge(27);

     
        OutputStream outputStream = new FileOutputStream("person.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(person);
        outputStream.close();
        objectOutputStream.close();

        InputStream inputStream = new FileInputStream("person.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        Person b = (Person) objectInputStream.readObject();
        System.out.println(b.getAge());
        System.out.println(b.getName());
  • 需要注意的点
    1、静态变量不会被序列化
    2、Transient关键字修饰的变量不会序列化
    3、若父类已实现Serializable接口,则子类可以不用再实现;若父类没有实现Serializable接口,子类实现了Serializable,则父类的属性不会被序列化。
    4、允许自定义序列化和反序列化过程,用于实现脱敏和加密;也可以通过自定义方法绕过Transient关键字的约束,如上例所示。

序列化算法指标

  • 可读性
  • 通用性:是否支持跨语言,跨平台
  • 性能:空间开销,时间开销

常见的序列化技术

1、Java序列化,优点:java语言本身提供,使用比较简单和方便。缺点:不支持跨语言处理、性能相对不是很好,序列化后产生的数据相对较大。

2、XML&SOAP
XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。标准的XML描述格式有两种:DTD(Document Type Definition)和XSD(XML Schema Definition)。
SOAP(Simple Object Access protocol) 是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议。SOAP在互联网影响如此大,以至于我们给基于SOAP的解决方案一个特定的名称--Web service。SOAP协议的主要接口描述语言(IDL)是WSDL(Web Service Description Language)。而WSDL的描述文件是XSD。

<xsd:complexType name='Person'>
     <xsd:attribute name='name' type='xsd:string' />
     <xsd:attribute name='age' type='xsd:int' />
</xsd:complexType>

3、JSON
JSON起源于弱类型语言Javascript, 它的产生来自于一种称之为"Associative array"的概念,其本质是就是采用"Attribute-value"的方式来描述对象。与XML相比,其协议比较简单,解析速度比较快。

  • Jackson
  • Gson
  • FastJson

4、Thrift
Thrift是Facebook开源提供的一个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。 但是,Thrift并不仅仅是序列化协议,而是一个RPC框架。相对于JSON和XML而言,Thrift在空间开销和解析性能上有了比较大的提升。但是由于Thrift的序列化被嵌入到Thrift框架里面,Thrift框架本身并没有透出序列化和反序列化接口,这导致其很难和其他传输层协议共同使用。

5、Protobuf
Protobuf具备了优秀的序列化协议的所需的众多典型特征。序列化数据非常简洁,紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10,解析速度非常快,比对应的XML快约20-100倍。但需要专门的Protobuf编译器编译。

相关文章

网友评论

    本文标题:序列化和反序列化

    本文链接:https://www.haomeiwen.com/subject/gseriftx.html