博客
关于我
序列化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 主从关系切换
    查看>>
    MYSQL 主从同步文档的大坑
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 事务知识点与优化建议
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>