序列化和反序列化

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
           {}

 

posted @ 2024-05-22 14:06  weigang  阅读(14)  评论(0编辑  收藏  举报