序列化: 将数据结构或对象转换成二进制串的过程。

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

首先我们通过复制文件举例,这里面就包含序列化与反序列化的过程:

public class Test2 : MonoBehaviour
{
byte[] buffer;
private void Start()
{
//一次性复制 适用于比较小的文件,如文本文档等。
//序列化过程
using (FileStream stream = new FileStream(Application.dataPath + @"\Resources\123.txt", FileMode.Open, FileAccess.Read))
{
//创建一个 byte 类型数组,用来存储通过文件流读取的文件,数组的长度就是文件的长度。
buffer = new byte[stream.Length];
//将读取到的文件转为字节数组存入 buffer 数组中
stream.Read(buffer, , buffer.Length);
}
//反序列化过程
using (FileStream stream = new FileStream(Application.dataPath + @"\Floder1\123.txt", FileMode.Create, FileAccess.Write))
{
//将 buffer 数组中的字节转换回相应的格式,并写入相应文件中
stream.Write(buffer, , buffer.Length);
}
}
}
public class Test2 : MonoBehaviour
{
byte[] buffer;//声明一个字节数组
private void Start()
{
//分批量复制 适用于比较大的文件,如音频、视频等文件。
//定义每次读入的文件大小,10KB。
int maxSize = ;
//开启读入流
FileStream streamRead = new FileStream(Application.dataPath + @"\Resources\吴奇隆 - 转弯.mp3", FileMode.Open, FileAccess.Read);
//开启写入流
FileStream streamWrite = new FileStream(Application.dataPath + @"\Floder1\转弯.mp3", FileMode.Create, FileAccess.Write);
//实例化数组,长度为 maxSize。
buffer = new byte[maxSize];
//当前读取的字节数量
int num = ;
do
{
//读入文件
num = streamRead.Read(buffer, , maxSize);
//写入文件
streamWrite.Write(buffer, , num);
} while (num > );
//释放流
streamWrite.Dispose();
streamRead.Dispose();
}
}

下面这个例子是做了一个 Cube 的预制体,然后场景中放一个预制体,通过存档将 Cube 的信息序列化存入硬盘中,通过读档再将 Cube 的信息反序列化出来,生成在场景中,一般用于游戏存档功能。

Unity3D中大部分类(例如:Vector3)是不能被序列化的,所以这个时候我们需要使用  IFormatter  类,并自己写出一些可以序列化的类(例如下面代码中的:Info 和 VectorX 这个两个类就是我自己写的可以用来序列化的类)来替代这些类,从而实现序列化。这里写这个只是想让大家明白序列化的原理。一般来说,我们都会使用 JsonUtility 类来实现游戏的存档功能,非常简单,在下面的代码方法二中有举例。我们也可以使用  LitJson  插件来实现,用法与  JsonUtility  大同小异,网上有很多教程,这里就不多说了。

 using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System; public class Test1 : MonoBehaviour {
public GameObject cube;
void OnGUI()
{
if (GUILayout.Button("存档"))
{
cube = GameObject.Find("Cube");
if (cube != null)
{
Color c = cube.GetComponent<MeshRenderer>().material.color;
Info info = new Info(cube.transform.position, c.r, c.g, c.b, c.a);
//方法一:
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(Application.dataPath + "/info.obj", FileMode.Create, FileAccess.Write);
formatter.Serialize(stream, info);
stream.Close(); //方法二:
//string str = JsonUtility.ToJson(info);
//File.WriteAllText(Application.dataPath + "/info.txt", str);
}
else
{
throw new Exception("物体不存在!");
}
}
if (GUILayout.Button("读档"))
{
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
IFormatter formatter = new BinaryFormatter();
//方法一:
Stream stream = new FileStream(Application.dataPath + "/info.obj", FileMode.Open, FileAccess.Read);
Info info = (Info)formatter.Deserialize(stream);
go.transform.position = info.pos;
go.GetComponent<MeshRenderer>().material.color = new Color(info.r, info.g, info.b, info.a);
stream.Dispose(); //方法二:
//string str = File.ReadAllText(Application.dataPath + "/info.txt");
//Info info = JsonUtility.FromJson<Info>(str);
//go.transform.position = info.pos;
//go.GetComponent<MeshRenderer>().material.color = new Color(info.r, info.g, info.b, info.a);
}
}
}
//在类的上面加上这个标签,这个类才能被序列化,需要注意。
[System.Serializable]
public class Info
{
public VectorX pos;
public float r;
public float g;
public float b;
public float a; public Info(VectorX pos,float r,float g,float b,float a)
{
this.pos = pos;
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
}

序列化与Json的更多相关文章

  1. C#中的二进制序列化和Json序列化

    序列化就是把一个对象变成流的形式,方便传输和还原.小弟不才,总结下对二进制序列化和Json序列化的使用: 1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在 ...

  2. 简单实体Json序列化(输出JSON的属性可变)

    简单实体Json序列化(输出JSON的属性可变) 一.先看效果 可以看出 , 我们在序列化一个对像时, 只给出了 我们想要 输出的两个字段名,  实际实体有5个属性, 经过可变属性序列化后的JSON ...

  3. JavaScript之form表单的序列化和json化[form.js]

    一.应用场景 form提交时,使用ajax提交. 二.效果 通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form ...

  4. 【转】Python之数据序列化(json、pickle、shelve)

    [转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...

  5. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  6. python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)

    1.昨日内容回顾 1.正则表达式     # 正则表达式 —— str           # 检测字符串是否符合要求     # 从大段的文字中找到符合要求的内容 1).元字符 #. # 匹配除换行 ...

  7. Python序列化之Json基础

    python的序列化就是将python的基本对象转换为字符串的过程,反之则是反序列化. 序列化类型: -> import json import pickle 序列化定义: 序列化:对象.列表. ...

  8. C# 序列化详解,xml序列化,json序列化对比

    本文讲讲一些纯技术的东西.并且讲讲一些原理性的东西,和一般的百度的文章不一致,如果你对序列化不清楚,绝对可以很有收获. 技术支持QQ群(主要面向工业软件及HSL组件的):592132877  (组件的 ...

  9. python序列化和json

    python 的序列化和反序列化用于内存之间的共享,包括服务器和客户端的共享,两个Python程序之间的共享,以及以字符串的形式存储到硬盘中. pyhton 的pickle 可以对Python的各种数 ...

  10. Atitit php序列化 php的serialize序列化和json序列化

    Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...

随机推荐

  1. Flume架构

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统: Flume 介绍 Flume是由cloudera软件公司产出的高可用.高可靠.分布式的海量日志收集系 ...

  2. shell:实现linux服务器资源监控并发送告警邮件

    1.安装方式 wget http://10.8.225.126/wsmonitor/install.sh;sh install.sh test@test.com 2.install.sh #!/bin ...

  3. mac os High Sierra 升级错误

    升级mac OS High Sierra错误 已经成功从10.10升级到10.12.8 mac OS  Sierra了.就是升级到10.13报错. you may not install to thi ...

  4. python 数据分析库介绍

    1 引言 高效处理数据的python工具: 与外界进行交互: 读写各种文件格式和数据库 准备: 对数据进行清理.修整.整合.规范化.重塑.切片切换.变形等处理以便进行分析 转换: 对数据集做一些数学和 ...

  5. java 多线程学习

    一.概念 程序.进程.线程 程序   是计算机指令的集合. 进程   是一个运行中的程序,它指的是从代码加载,执行到执行结束这样一个完整过程.每个进程占用不同的内存空间. 线程   是进程中某个单一顺 ...

  6. R语言-图的要素颜色

    1.设置图形要素的颜色 Plot函数中,使用col=参数来决定要素的颜色 如果不指定plot type,颜色加在散点上,如果指定了plot type,例如line,则颜色加在线上 其它函数,例如bar ...

  7. mallo

    http://luleimi.blog.163.com/blog/static/175219645201302295042968/

  8. 使用pandas进行数据预处理01

    数据预处理有四种技术:数据合并,数据清洗,数据标准化,以及数据转换. 数据合并技术:(1)横向或纵向堆叠合数据 (2)主键合并数据 (3)重叠合并数据 1.堆叠合并数据: 堆叠就是简单的把两个表拼接在 ...

  9. 阿里巴巴Java开发手册与自己开发对照笔记

    一编程规约 (一)命名风格 某些时候在命名常量的时候,会觉得太长而减少长度导致命名不清. 抽象类及测试类写得比较少. 这一点值得注意,在开发中,布尔变量我都是使用is开始. 关于包名和类名的单数和复数 ...

  10. H5相关网址

    html5中国 http://www.html5cn.org/   HTML 5 教程 http://www.w3school.com.cn/html5/index.asp   http://www. ...