导航:首页 > 方法技巧 > 快速反序列化的方法

快速反序列化的方法

发布时间:2023-01-25 20:50:23

1. 序列化和反序列化原理

没有实现序列化的对象通过流传输会报NotSeralizableException

跨jvm传输的办法:序列化和反序列化
序列化:把对象(object)转化成特定的形态(xml, json),然后以数据流的方式传输
序列化不会自动保存static和transient变量
好处:减少对象的大小,对象传递的跨平台/语言
反序列化:数据流 ->特定格式(xml,json)->对象

private static final long serialVersionUID = -2975139301805213397L;
serialVersionUID是对象唯一的标记
若不指定serialVersionUID,系统会自动生成一个
关键字transient 修饰的对象,表示该对象不需要序列化
实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

HashMap

自定义序列化和反序列化方法,通过反射访问private方法

分布式架构下的序列化技术
1、序列化的数据大小(影响传输效率)
2、跨语言, json(对外接口的通信)/xml
对内的服务于服务之间一般使用:
1、hessian
2、msgpack
3、prototuf(压缩率非常高)(不易使用)
4、kyro
5、avro
6、hassian2(bbo)
7、json(spring cloud)
8、jute(zookeeper)

JSON
Fastjson :序列化,和反序列化速度快,接口简单,易上手
jackson(spring mvc): 性能要比fastjson和gson要好,稳定性更好
Gson

hessian
性能、易用性要比默认的序列化方式要好
kyro、avro :大数据处理有使用,不能跨语言
prototuf:序列化数据非常小、传输效率非常高,每个字段会按照tag、length(可省略)、value进行序列化

序列化的选项:
序列化空间的大小,(空间)
序列化过程的效率,(时间)
是否支持跨语言
技术的成熟度

2. 如何序列化/反序列化的ArrayList

、Binary方法进行序列化
1、首先。你被序列化的类需要用[Serializable]特性修饰,例如:
[Serializable]
public class AA
{
public int i = 5;
}
2、那么你可以用如下方法序列化和反序列化:
/// <summary>
/// 序列化为二进制字节数组
/// </summary>
/// <param name="request">要序列化的对象 </param>
/// <returns>字节数组 </returns>
public static byte[] SerializeBinary<T>(T request)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream memStream = new System.IO.MemoryStream();
serializer.Serialize(memStream, request);
return memStream.GetBuffer();
}
/// <summary>
/// 从二进制数组反序列化得到对象
/// </summary>
/// <param name="buf">字节数组 </param>
/// <returns>得到的对象 </returns>
public static T DeserializeBinary<T>(byte[] buf)
{
System.IO.MemoryStream memStream = new MemoryStream(buf);
memStream.Position = 0;
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
T newobj = (T)deserializer.Deserialize(memStream);
memStream.Close();
return newobj;
}
3、调用方法
AA p = new AA();
p.i = 15;
byte[] bytes = SerializeBinary<AA>(p);
AA p2 = DeserializeBinary<AA>(bytes);

二、XML序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace RegexActivator
{
public class ExtendMethods
{
public static void Serial<T>(T[] items, string path)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]));
TextWriter writer = new StreamWriter(path);
try
{
xmlSerializer.Serialize(writer, items);
}
finally
{
writer.Close();
}
}
public static T[] Deserial<T>(string path)
{
if (!File.Exists(path)) return new T[0];
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T[]));
FileStream fs = new FileStream(path, FileMode.Open);
T[] items;
try
{
items = (T[])xmlSerializer.Deserialize(fs);
}
finally
{
fs.Close();
}
return items;
}
}
}

阅读全文

与快速反序列化的方法相关的资料

热点内容
碳水化合物检测方法 浏览:534
大数据教学方法论文 浏览:464
红米手机开机键在哪里设置方法 浏览:71
整数减分数最简单的方法 浏览:657
14x37x5的简便方法 浏览:329
定制衣柜门套安装方法 浏览:447
做衣服用电机方法视频 浏览:484
比例是运用了什么思想方法 浏览:421
楼梯弯头度数计算方法 浏览:980
安全提篮使用方法 浏览:564
如何做作业的新方法 浏览:684
帝王菜的功效与作用及食用方法 浏览:227
基础梁设计处理的计算方法 浏览:318
打啤酒的正确方法视频 浏览:277
蓝牙连接有线路由器的方法 浏览:970
学英语的方法和技巧答案 浏览:848
办案区防撞软包安装方法 浏览:610
防雷接地装置计算方法 浏览:636
临床化学检测多用什么方法 浏览:279
催乳按摩方法图片 浏览:263