序列化与Json
序列化: 将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
首先我们通过复制文件举例,这里面就包含序列化与反序列化的过程:
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的更多相关文章
- C#中的二进制序列化和Json序列化
序列化就是把一个对象变成流的形式,方便传输和还原.小弟不才,总结下对二进制序列化和Json序列化的使用: 1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在 ...
- 简单实体Json序列化(输出JSON的属性可变)
简单实体Json序列化(输出JSON的属性可变) 一.先看效果 可以看出 , 我们在序列化一个对像时, 只给出了 我们想要 输出的两个字段名, 实际实体有5个属性, 经过可变属性序列化后的JSON ...
- JavaScript之form表单的序列化和json化[form.js]
一.应用场景 form提交时,使用ajax提交. 二.效果 通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form ...
- 【转】Python之数据序列化(json、pickle、shelve)
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
- python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)
一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...
- python全栈开发day17-常用模块collections,random,time,os,sys,序列化(json pickle shelve)
1.昨日内容回顾 1.正则表达式 # 正则表达式 —— str # 检测字符串是否符合要求 # 从大段的文字中找到符合要求的内容 1).元字符 #. # 匹配除换行 ...
- Python序列化之Json基础
python的序列化就是将python的基本对象转换为字符串的过程,反之则是反序列化. 序列化类型: -> import json import pickle 序列化定义: 序列化:对象.列表. ...
- C# 序列化详解,xml序列化,json序列化对比
本文讲讲一些纯技术的东西.并且讲讲一些原理性的东西,和一般的百度的文章不一致,如果你对序列化不清楚,绝对可以很有收获. 技术支持QQ群(主要面向工业软件及HSL组件的):592132877 (组件的 ...
- python序列化和json
python 的序列化和反序列化用于内存之间的共享,包括服务器和客户端的共享,两个Python程序之间的共享,以及以字符串的形式存储到硬盘中. pyhton 的pickle 可以对Python的各种数 ...
- Atitit php序列化 php的serialize序列化和json序列化
Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...
随机推荐
- 深入学习 Java 序列化
前言 对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化 ...
- 一份快速完整的Tensorflow模型保存和恢复教程(译)(转载)
该文章转自https://blog.csdn.net/sinat_34474705/article/details/78995196 我在进行图像识别使用ckpt文件预测的时候,这个文章给我提供了极大 ...
- mybatis拦截器获取sql
mybatis获取sql代码 package com.icourt.alpha.log.interceptor; import org.apache.ibatis.executor.Executor; ...
- leetcode5
public class Solution { private int lo, maxLen; public String LongestPalindrome(String s) { int len ...
- Sphinx 与全文索引
全文索引创建过程 第一步:将源文档传给分词组件(Tokenizer) 分词组件做了以下事情: 将文档分成一个一个的单词 去除标点符号 去除停词:英文(the / a / this / that ... ...
- git克隆远程仓库的时候断电了,使用git-fetch断点续传
今天下载tensorflow serving 模型,但是因为主机电源线太长了,不知是我自己搞的还是同事,断电了都, 网速捉急,下载了挺长时间的,一看,git clone 到中途竟然断电,不过查看,还好 ...
- cdnbest站点里设置防盗链
设置需求只允许 test.kangleweb.com 访问 ,其他网站链接全部拒绝 (注:如果test.kangleweb.com是用https访问,那引用的内容地址www447.yivpn.cn也 ...
- Yii 框架不同逻辑处理方法统一事务处理
1.定义事务处理接口 <?php namespace frontend\business\SaveRecordByransactions; /** * Interface ISaveForTra ...
- C++内存空间
- centos部署redis主从
安装环境 CentOS 6.5 .CentOS 7.4 主Redis:10.159.44.175 从Redis: 10.159.44.176.10.159.44.177 Redis下载和安装 在3台机 ...