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

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

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

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. winCVS 使用的一个小要点

    对于版本管理软件CVS,可以在Linux中使用命令来管理. 但是 在windows 界面下,也可以使用 winCVS 工具来管理. 现在 讲一下 如何 在 winCVS 登陆 CVS 帐号 和 密码: ...

  2. rabbitmq (一)用法

    首先,主机一是window系统,虚拟机二 ubuntu, ubuntu部署了rabbitmq服务端.默认监听5672端口. 由于rabbitmq内部有严格的权限系统,使用之前必须配置好权限. 默认网页 ...

  3. Dubbo源码阅读顺序

    转载: https://blog.csdn.net/heroqiang/article/details/85340958 Dubbo源码解析之配置解析篇,主要内容是<dubbo:service/ ...

  4. java GC是在什么时候,对什么东西,做了什么事情

    面试题:“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?” 面试题目:地球人都知道,Java有个东西叫垃圾收集器,它让创建的对象不需要像c/cpp那样delete.free掉,你 ...

  5. C++获取当前执行程序文件所在的全路径

  6. final关键字特点

    一.final关键字修饰的类 无法被继承(即不能有子类) 二.final关键字修饰的方法不能被重写 三.final关键字修饰的变量成为常量(即不允许被修改) 开发中经常使用   

  7. Rabbitmq(5) 路由模式

    设置路由键 发送者 package com.aynu.bootamqp.service; import com.aynu.bootamqp.commons.utils.Amqp; import com ...

  8. svn的下载及安装

    什么是SVN: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. SVN的下载安装: 下载地址:https: ...

  9. js 菜单收起和展开

  10. AD+DMA+USART实验中的收获和总结

    由于实验室用的是USART3接口,但是在基地实验时,由于没有RS232,只能换到USART1,进行实验.(在交作业的时候,记得要再换回去) 在这个过程中,遇到困难,用串口软件发送数据时无响应,应该意味 ...