范性使用
/**
* 抽取序列化 反序列化
* 序列化 根据对象 返回byte[]
*
* 返序列化根据byte【】 返回class
*/
//public byte[] serialize(Object obj);
/**
* 序列化方法,把一个对象转换字节数组
* @param obj
* @param <T>
* @return
*/
<T> byte[] serialize(T obj);
/**
* 反序列方法,把一个字节数组转换成一个对象
* @param buffer
* @param cls
* @param <T>
* @return
*/
<T> T deSerialize(byte[] buffer, Class<T> cls);
/**
* 是否用范性 其实取决于调用者
* Object o = serialize.deSerialize(bytes, Class.class);
* System.out.println(o);
* String s = serialize.deSerialize(bytes, name.getClass());
* System.out.println(s);
*/
throw 无需返回值
Serializable 接口
到设置中添加 JVM Languages 的 序列化 检查
只有添加检查后 才会有提示 只有添加检查后 才会有提示 只有添加检查后 才会有提示
序列化 如果没有 serialVersionUID 设置如果当字段发生变化 ,就会报错了
静态变量不会序列化
父类的序列化
一个子类实现了 Serializable 接口,它的父类都没有实现 Serializable,那么对于父类中的变量不会实现序列化操作
如果一个父类实现了Serializabla接口, 子类可以不用实现Serializable, 也会对对象的属性进行序列化操作
transient
声明为transient的字段一般不会进行序列化, 对于一个敏感信息, 可以声明为transient
对象克隆
浅克隆 Cloneable
深度克隆 (利用jdk序列化)
Protobuf序列化
idea安装插件
这里暂时不安装 应该也是可以的 因为不好搜索 Protobuf support
这里其实是先配置 pom.xml 然后自主下载的
导入Maven插件
- 定义属性 区分操作系统 如果是Mac用 如果windows
windows
<os.detected.classifier>windows-x86_64</os.detected.classifier>
Mac
<os.detected.classifier> osx-x86_64</os.detected.classifier>
- 依赖 3.12.0
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.12.0</version>
</dependency>
- 安装插件 3.12.0 版本对应上
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>
com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
</configuration>
</plugin>
例子
在 main 下面创建 proto 文件夹 创建一个 .proto文件
// 使用的协议版本 proto3 proto2
syntax = "proto3";
// 生成的Java类的包
option java_package = "com.wpp.serializedemo.domain";
// 创建一个文件名 TestModel的Java文件
option java_outer_classname = "TestModel";
// 具体需要序列化的类
message TestClass {
// 对于后面的数字是唯一的一个编号
string name = 1 ;
string password = 2 ;
int32 age= 3 ;
}
把 生成文件 拖入domain里面 测试一把 (如果是拷贝 记得删除生成的Java文件哦 别重复了) 测试程序
TestModel.TestClass testClass = TestModel.TestClass.newBuilder().setName("测试类").setAge(10).setPassword("123456").build();
byte[] bytes = testClass.toByteArray();
System.out.println(bytes.length);
TestModel.TestClass testClass1 = TestModel.TestClass.parseFrom(bytes);
System.out.println(testClass1);