• unity 序列化和反序列化


    什么是序列化和反序列化
    (1)序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程;.
      (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。

    (3)反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象

    (4)本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。


    2、为什么需要序列化与反序列化
    我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。
    那么当两个进程进行通信时,能否实现进程间的对象传送呢?答案是可以的!如何做到呢?这就需要序列化与反序列化了!
    换句话说,一方面,发送方需要把这个对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出对象。
    当我们明晰了为什么需要Java序列化和反序列化后,我们很自然地会想序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

    总的来说可以归结为以下几点:

    (1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
    (2)通过序列化以字节流的形式使对象在网络中进行传递和接收;
    (3)通过序列化在进程间传递对象;

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    using Newtonsoft.Json;
    
    public class TestJSON : MonoBehaviour
    {
    
        void Start()
        {
    
            Product product = new Product();
            product.dic[""] = "";
            product.name = "小明";
            string json = JsonConvert.SerializeObject(product);
    
            Product m = JsonConvert.DeserializeObject<Product>(json);
    
            Debug.Log(json);
            Debug.Log(m.name);
        }
    
    
        public class Product
        {
            public string name;
            public Dictionary<string, string> dic = new Dictionary<string, string>();
        }
    
    }
    TestJSON
    ChatMessage
    需要导入命名空间
    using System.IO;
    using System.Xml.Serialization;
    using UnityEditor;
    
    先定义一个类:
    public class Studnet{
    public string m_Name = "仑仑";
    }
    
    public class SerializeDemo : MonoBehaviour {
    
    
         void Start()
        {
            序列化:
            Student student = new Student();
            //第一要确定储存的位置
            //Application.dataPath就是unity中的Asset文件夹 
            StreamWriter sw = new StreamWriter(Application.dataPath + "/Demo.xml");
            //第二要对什么类型序列化
            XmlSerializer xs = new XmlSerializer(typeof(Student));
            //第三对对象序列化
            xs.Serialize(sw, student);
            //关闭流
            sw.Close();
            //刷新Asset文件
            AssetDatabase.Refresh();
            //运行程序会在Asset目录下看到Demo.xml文件
    
    
            反序列化
            //第一确定对哪个文件进行反序列化
            StreamReader sr = new StreamReader(Application.dataPath + "/Demo.xml");
            //第二要确定对什么类型反序列化
            XmlSerializer xs1 = new XmlSerializer(typeof(Student));
            //第三反序列化
            Student student1 = xs1.Deserialize(sr) as Student;
            //关闭流
            sr.Close();
            //会在控制台看到 “仑仑”
            print(student1.m_Name);
        }
    }
    SerializeDemo
  • 相关阅读:
    java1.8时间比较应用
    Window配置网络设定IPv4的固定IP自动被修改为169.254.*.*的问题
    osgi内嵌jetty容器添加过滤器
    jackson依赖的jar包
    Tomcat下ajax请求路径总结
    JavaScript中一个字符串变量突然变成了false的问题解析
    Ajax请求发送的FormData是"[object object]"
    jQuery的$.extend方法使用
    JS 异常:Uncaught RangeError: Maximum call stack size exceeded解析
    Java的重写equals但不重写hashCode方法的影响
  • 原文地址:https://www.cnblogs.com/ASsss/p/10470664.html
Copyright © 2020-2023  润新知