序列化和反序列化
1.什么是序列化和反序列化?
序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。
2.序列化的目的?
序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。
3.序列化协议的选择?
序列化协议各有千秋,不能简单的说一种序列化协议是最好的,只能从你的当时环境下去选择最适合你们的序列化协议,如果你要为你的公司项目进行序列化技术的选型,那么主要从以下几个因素。协议是否支持跨平台序列化的速度
序列化出来的大小
4.Java实现序列化
java 实现序列化很简单,只需要实现Serializable 接口即可
public class User implements Serializable{ //年龄 private int age; //名字 private String name ; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name;} public void setName(String name) { this.name = name;} }
序列化之后可以写入文件
FileOutputStream fos = new FileOutputStream("D:\\temp.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); User user = new User(); user.setAge(18); user.setName("sandy"); oos.writeObject(user); oos.flush(); oos.close();
再从文件中读取转换为对象
FileInputStream fis = new FileInputStream("D:\\temp.txt"); ObjectInputStream oin = new ObjectInputStream(fis); User user = (User) oin.readObject(); System.out.println("name="+user.getName());
5.C#序列化
序列化可以使用protobuf,是一种序列化格式 [Unity文件处理]ProtoBuf.note
C#自带序列化为BinaryFormatter类(System.Runtime.Serialization.Formatters.Binarry)可以将对象序列化为二进制数据,把二进制数据反序列化为对象
序列化类转换成二进制,保存为txt
/// <summary> /// 类转换成二进制 /// </summary> /// <param name="path"></param> /// <param name="obj"></param> /// <returns></returns> public static bool BinarySerilize(string path, System.Object obj) { try { using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, obj); } return true; } catch (Exception e) { Debug.LogError("此类无法转换成二进制 " + obj.GetType() + "," + e); } return false; }
反序列化转换为对象
/// <summary> /// 反序列化 /// </summary> public T BinaryDeSerilize<T>(string path) where T : class { try { using (FileStream loadFile = new FileStream(path, FileMode.Open, FileAccess.Read)) { BinaryFormatter bf = new BinaryFormatter(); return bf.Deserialize(loadFile) as T; } } catch (IOException e) { Debug.LogError("反序列化错误," + path + "," + e); } return null; }
Unity序列化:
1.序列化的是类中的字段、属性--->除此之外,其他一切不会参与序列化的过程。
2.序列化: 属性、字段必须为public。
3.序列化的过程可以看做是: 先创建一个对象,然后再对对象里边的成员进行复制,所以xml序列化的成员必须是public,public说明成员可以在类外部进行访问,对象一旦被创建就会为它分配空间。
编辑器中序列化的作用是: 可以显示变量(类,结构等)在inspector(检视面板)上
[System.Serializable]
|
把自定义的类变成可以在Unity编辑器中看到的类
|
[HideInInspector]
|
表示将原本显示在面板上的序列化值隐藏起来。
|
[SerializeField]
|
可以把私有的变量显示出来
|
1、如果a是公有的序列化变量。
(1)如果你想要在面板中看到变量a,那么用: public int a;
(2)如果你不想在面板中看到变量a,那么用: [HideInInspector] public int a; 这样a可以在程序中被代码赋值,但不会在面板中看到,也不能手动设置赋值。
2、如果a是私有的序列化变量,你想在面板中读取并赋值,那么用:
[SerializeField] private int a;
3、如果a是私有的序列化变量,你想在面板中读取,但是不赋值,那么用:
[HideInInspector][SerializedField] private int a; public int b { get{return a;} } 然后在Editor中显示,EditorGUILayout.LabelField("value",game.b.ToString());
4、如果a是私有序列化变量,你不想在面板中做任何操作(不想看到,也不想写),但是想要在程序中给它赋值,那么用。
[HideInInspector] [SerializedField] private int a; public int b {}