标签:
学习笔记适合新手,如有错误请指正。?号处也请各位指点下,谢谢。
JSON是一种轻量级的数据交换和存储格式。
可用于对数据的设备(如手机的本地存储)和向Web服务器上传
并且符合面向对象编程思想
JSON数据格式
书写格式是:名称/值,如“name”,“张三”
JSON基本结构:
1.对象:用{}包裹,用名称/值来表示对象中的一个属性
public class Person { public string name; public int age; public Person(string _name,int _age) { name = _name; age = _age; } }
对象persong john=new person("John",19);用JSON表示就是{"name":"John","Johb":"19"}
数组
用[] 包裹,用“,”表示并列关系,如:
{“people”:[{"name":"John","age":"19"},{"name":"Tom","age":"18"}]}
JsonFx是一个类对象和JSON数据相互转换的动态链接库,网上有很多这样的库
在代码清单10-1中定义了person类,在代码清单10-2中创建对象John,再将John转成JSON字符串,然后将JSON字符串转换回Person对象
代码清单10-1
public class Person { public string name; public int age; public Person(string _name,int _age) { name = _name; age = _age; } }
代码清单10-2
using UnityEngine; using System.Collections; using JsonFx.Json; public class C_10_2_1 : MonoBehaviour { void Start () { Person john = new Person("John",19); //将对象序列化成JSON字符串 string Json_Text = JsonWriter.Serialize(john); Debug.Log(Json_Text); //将JSON字符串反序列化成对象 john = JsonReader.Deserialize(Json_Text) as Person; } }
?:
1:Person john = new Person("John",19);我理解为:声明数组
2:string Json_Text = JsonWriter.Serialize(john);我理解为:就是字符串转化,为了便于输出
3:john = JsonReader.Deserialize(Json_Text) as Person;这个我理解为再把字符串转化成person,这里反序列化是什么鬼?百度一下如下,但是还有个疑问这里反序列化对象这是要干嘛?
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
以上理解有错的地方,请各位大神指点出来
数据存储
Unity使用的Mono是跨平台的,符合.Net框架
我们可以使用System.IO下的File.ReadAllText()和File.WriteAllText()这两个函数来实现数据的存储
得到存储路径,代码如下:
public static string GetDataPath() { if (Application.platform == RuntimePlatform.IPhonePlayer) { //Iphone路径 string path = Application.dataPath.Substring(0, Application.dataPath.Length - 5); path = path.Substring(0, path.LastIndexOf(‘/‘)); return path + "/Documents"; } else { if (Application.platform == RuntimePlatform.Android) { //安卓路径 return Application.persistentDataPath + "/"; } else { //其他路径 return Application.dataPath;//数据文件夹路径 } } }
最后一步,将JSON数据写到该路径:
File.WriteAllText(GetDataPath() + "/" + "FileName", Json_Text);
数据存储功能的完整代码如下:
using UnityEngine; using System.Collections; using JsonFx.Json; using System.IO; public class C_10_2_2 : MonoBehaviour { string path = "/Chapter8/8.2/data.txt"; void OnGUI () { if(GUILayout.Button("保存")) { Write(); } if(GUILayout.Button("读取")) { Read(); } } void Write()//保存 { Person john = new Person("John",19); string Json_Text = JsonWriter.Serialize(john); File.WriteAllText (GetDataPath () +path, Json_Text); } void Read()//读取 { string Json_Text = File.ReadAllText (GetDataPath () +path); Person john = JsonReader.Deserialize<Person>(Json_Text); Debug.Log(john.name +"‘s age is "+john.age); } public static string GetDataPath () { if (Application.platform == RuntimePlatform.IPhonePlayer) { //iphone路径 string path = Application.dataPath.Substring (0, Application.dataPath.Length - 5); path = path.Substring (0, path.LastIndexOf (‘/‘)); return path + "/Documents"; } else if (Application.platform == RuntimePlatform.Android) { //安卓路径 return Application.persistentDataPath + "/"; } else { //其他路径 return Application.dataPath; } } }
运行,先点击保存按钮,刷新(Ctrl+r),发现在文件1.2.2下多了刚在保存的data.Text文件,并且可以看到里边内容,点击读取,看见控制台输出“John‘s age is 19”
数据加密
打开data.Text文件可以看到文本内容十分不安全,需要对文本加密
加密的算法有很多,如RC2、RC4等,这里使用Rijidael算法
Rijndael是.NET里包含的一个加密接口,在加密和解密是都使用相同的秘钥,位于System.Security.Crytography命名空间下,Rijindael算法符合AES堆成密码标准,秘钥长度为128、192、256位之一
加密步骤如下:
1.设置字符串秘钥并转化为byte数组,这里使用32的字符串转化为长度为32的byte数组,也就是256位的秘钥
start string key="1221321321321321213";
byte[] keyArray=UTF8Encoding.UTF8.GetBytes(key);
2.创建RijndaelManaged对象并设置参数
RijndaelManaged rDel=new RijndaelManaged();
rDel.Key=keyArray;
rDel.Mode=CipherMode.ECB;
rDel.Padding=PaddingMode.PKCS7;
ICryptoTransform cTransform=rDel.CreateEncryptor();
3.加密
//将原始字符串转化成byte数组
byte[] toEncryptArray=UTF8Encoding.UTF8.GetBytes("content");
//加密
byte[] resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Lenght);
//转换回字符串并返回
return Convert.ToBase64String(resultArray,0,resultArray.Length);
解密步骤如下:
1和加密共用同样的秘钥
2创建RijndaelManaged对象并设置参数,和加密的第二步一致
3解密
//将加密后的字符串转化成byte数组
byte[] toEncryptArry=Convert.FromBase64String(toD);
//解密
byte[] resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
//转换回字符串并返回
return UTF8Encoding.UTF8.GetString(resultArray);
整个字符串加密与解密代码如下:
using UnityEngine; using System; using System.Text; using System.Collections; using System.Security.Cryptography; public class C_10_2_3{ static string key = "12348578902223367877723456789012"; /// <summary> /// 字符串加密 /// </summary> private static string Encrypt (string toE) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes (key); RijndaelManaged rDel = new RijndaelManaged (); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor (); byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toE); byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String (resultArray, 0, resultArray.Length); } /// <summary> /// 字符串解密 /// </summary> private static string Decrypt (string toD) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes (key); RijndaelManaged rDel = new RijndaelManaged (); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor (); byte[] toEncryptArray = Convert.FromBase64String (toD); byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString (resultArray); } }
标签:
原文地址:http://www.cnblogs.com/kubll/p/4934916.html