博客
关于我
序列化xml\json\protobuffer
阅读量:279 次
发布时间:2019-03-01

本文共 3691 字,大约阅读时间需要 12 分钟。

序列化技术:从基础到实践

序列化定义

序列化是一种用于将对象转换为可以传输或存储的数据格式的技术。简单来说,它就是将内存中的对象转换为可以保存到文件、通过网络传输或在进程间传递的二进制数据。

特点

  • 持久化:通过序列化可以将对象的状态保存到本地文件中,方便恢复。
  • 传输:通过序列化可以在网络中或进程间传递对象,避免对象的层次结构被破坏。
  • 效率:对于需要频繁传输或持久化的对象,序列化能够有效减少数据体量,提升传输效率。

序列化的作用

  • 永久性保存对象:通过序列化可以将对象的字节序列保存到本地文件中,方便后续恢复。
  • 网络传输:通过序列化可以在网络中传输对象,避免由于对象的传输层次结构问题导致的通信失败。
  • 进程间传递:通过序列化可以在不同的进程间传递对象,实现进程间的通信。

  • 序列化的分类

    序列化技术可以分为以下几种:

    1. Serializable(Java特有)

    Serializable是Java语言中最常用的序列化方式,通过反射机制将对象的状态转换为字节流。这种方式简单易用,但存在以下缺点:

    • 性能较差:由于反射机制的开销较大,序列化速度较慢。
    • 内存占用:序列化过程会生成大量临时对象,可能导致内存泄漏和垃圾回收压力增大。

    2. Parcelable(Android特有)

    Parcelable是Android系统中专用的序列化方式,与Java的Serializable不同,它通过将对象分解为多个部分,每一部分都是Android支持的基本数据类型。这种方式的优势在于:

    • 效率更高:减少了反射操作,提升了序列化和反序列化的速度。
    • 传输更安全:每一部分数据独立传输,降低了传输失败的风险。
    • 适合Android:由于Android的Intent对象本身支持Parcelable类型的数据传输,非常适合用于跨组件的数据传递。

    常见的序列化方式

    1. 二进制序列化

    二进制序列化将对象的状态直接转换为字节数组。这种方式的优点是:

    • 体积小:字节数组的体积通常比其他格式更小。
    • 速度快:序列化和反序列化过程较快。

    示例代码

    public static class Person implements Serializable {    private static final long serialVersionUID = 233858934995755239L;    private String firstName;    private String lastName;    // 其他字段...}// 二进制序列化ObjectOutputStream outStream = new ObjectOutputStream(new FileOutputStream(filePath));outStream.writeObject(person);

    2. XML序列化

    XML序列化将对象的状态转换为XML格式的字符串。这种方式的优点是:

    • 可读性强:生成的XML文件可以被普通文本编辑器阅读和修改。
    • 灵活性高:支持复杂的数据结构,且字段名和值的对应关系明确。

    示例代码

    void XmlSerialize(TestSerialize testSerialize) {    FileStream fileStream = new FileStream(Application.dataPath + "/Test.xml", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);    StreamWriter sw = new StreamWriter(fileStream, System.Text.Encoding.UTF8);    XmlSerializer xmlSerializer = new XmlSerializer(testSerialize.GetType());    xmlSerializer.Serialize(sw, testSerialize);    sw.Close();    fileStream.Close();}

    3. JSON序列化

    JSON序列化将对象的状态转换为JSON格式的字符串。这种方式的优点是:

    • 数据结构简单:JSON采用键值对的形式,结构清晰。
    • 解析简单:可以通过第三方库(如Newtonsoft.Json)快速解析JSON字符串为对象。

    示例代码

    var json = new { user = new { name = "fxhl", age = 23 } };string jsonData = JsonConvert.SerializeObject(json);Console.WriteLine(jsonData);

    4. Protobuf序列化

    Protobuf(Protocol Buffers)是一种高效的通用序列化格式,基于Google的协议缓存。它的优点是:

    • 性能优异:序列化和反序列化速度远快于其他格式。
    • 灵活性高:支持多种数据类型,且字段名和值的对应关系明确。

    Protobuf的使用步骤

  • 定义.proto文件:在.proto文件中定义需要序列化的对象。
  • 生成Java类:使用protoc工具将.proto文件转换为Java类。
  • 实现Parcelable:通过生成的Java类实现Parcelable接口,进行序列化和反序列化。
  • 示例代码

    message Person {    required string name = 1;    required int32 id = 2;    optional string email = 3;    enum PhoneType {        MOBILE = 0;        HOME = 1;        WORK = 2;    }    message PhoneNumber {        required string number = 1;        optional PhoneType type = 2 [default = HOME];    }    repeated PhoneNumber phone = 4;}// 使用示例Demo.Person.Builder personBuilder = Demo.Person.newBuilder();personBuilder.setName("Carson");personBuilder.setId(123);personBuilder.setEmail("carson.ho@foxmail.com");Demo.Person.PhoneNumber.Builder phoneNumberBuilder = Demo.Person.PhoneNumber.newBuilder();phoneNumberBuilder.setType(Demo.Person.PhoneType.HOME);phoneNumberBuilder.setNumber("0157-23443276");Demo.Person person = personBuilder.build();// 序列化byte[] byteArray = person.toByteArray();System.out.println(Arrays.toString(byteArray));

    序列化与传输格式的比较

    1. 二进制 vs XML

    • 二进制:直接以字节流形式传输,传输效率高,适合大数据量的传输。
    • XML:以键值对的形式传输,灵活性高,适合需要理解数据结构的场景。

    2. Protobuf vs JSON

    • Protobuf:基于字段的编号和类型,传输效率极高,适合大规模数据的传输。
    • JSON:基于键值对,易于理解和解析,适合需要灵活数据结构的场景。

    3. Protobuf vs XML

    • Protobuf:通过字段编号和类型编码,传输效率更高,解析速度更快。
    • XML:需要解析整个文档结构,解析速度相对较慢。

    Parcel和Parcelable的区别

    Parcel是Android系统中用于进程间数据传输的机制,与Java的Serializable类似,但有以下优势:

    • 效率更高:通过将对象分解为多个Parcel片段,减少了反射操作。
    • 传输更可靠:每一片段都可以独立传输,降低了传输失败的风险。
    • 适合Android:与Android的Intent对象无缝集成,支持 Parcelable类型的数据传输。

    总结

    序列化技术是实现对象持久化、网络传输和进程通信的核心技术。通过选择合适的序列化方式,可以在性能、灵活性和传输效率之间找到平衡。无论是Java的Serializable还是Android的Parcelable,都有其适用的场景。了解这些技术的细节,可以帮助开发者更好地设计和优化应用程序。

    转载地址:http://xgyx.baihongyu.com/

    你可能感兴趣的文章
    MySQL InnoDB中意向锁的作用及原理探
    查看>>
    MySQL InnoDB事务隔离级别与锁机制深入解析
    查看>>
    Mysql InnoDB存储引擎 —— 数据页
    查看>>
    Mysql InnoDB存储引擎中的checkpoint技术
    查看>>
    Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
    查看>>
    MySQL InnoDB引擎的锁机制详解
    查看>>
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>