前段时间项目中需要一个通用的解析工具,
主要是大家之前各写各的方式,搞得很乱,然后我就写了这个小插件。
大致说下思路,一个接口,一个基类,两个子类(一个用于Json解析,一个用于XML的,好像其他不用着),一个帮助类。
主要是通过帮助类来进行解析文件的,
代码部分-----
接口:
public interface IDataParser<T>
{
string SerializeToObject(T _Object, System.Text.Encoding encoding);
T DeserializeToObject(string data, System.Text.Encoding encoding);
}
基类:
public abstract class BaseDataParser<T> : IDataParser<T>
{
public abstract string SerializeToObject(T _Object, System.Text.Encoding encoding);
public abstract T DeserializeToObject(string data, System.Text.Encoding encoding);
}
Json类:
public class JsonParser<T> : BaseDataParser<T> where T : class, new()
{
/// <summary>
/// 序列化
/// </summary>
public override string SerializeToObject(T _Object, System.Text.Encoding encoding)
{
return encoding.GetString(encoding.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(_Object)));
}
/// <summary>
/// 反序列化
/// </summary>
public override T DeserializeToObject(string data, System.Text.Encoding encoding)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(encoding.GetString(encoding.GetBytes(data)));
}
}
XML类:
public class XmlParser<T> : BaseDataParser<T> where T : class, new()
{
/// <summary>
/// 序列化
/// </summary>
public override string SerializeToObject(T _Object, System.Text.Encoding encoding)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
//ns.Add("", "");
XmlSerializer xs = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(stream, encoding);
writer.Formatting = Formatting.Indented;//缩进
xs.Serialize(writer, _Object, ns);
stream.Position = 0;
StringBuilder sb = new StringBuilder();
using (StreamReader reader = new StreamReader(stream, encoding))
{
string line;
while ((line = reader.ReadLine()) != null)
{
sb.AppendLine(line);
}
reader.Close();
}
writer.Close();
return sb.ToString();
}
/// <summary>
/// 反序列化
/// </summary>
public override T DeserializeToObject(string data, System.Text.Encoding encoding)
{
try
{
var xml = new XmlSerializer(typeof(T));
using (var ms = new MemoryStream(encoding.GetBytes(data)))
{
using (var sr = new StreamReader(ms, encoding))
{
return (T)xml.Deserialize(sr);
}
}
}
catch (System.Exception e)
{
UnityEngine.Debug.Log(e.Message);
return default(T);
}
}
}
帮助类:
public static class DataHelper
{
/// <summary>
/// 序列化 默认格式UTF8
/// </summary>
public static string SerializeToObject<T>(this T _Object, Parser.IDataParser<T> dataParser) where T : class, new()
{
return dataParser.SerializeToObject(_Object, System.Text.Encoding.UTF8);
}
/// <summary>
/// 序列化 encoding 编码格式
/// </summary>
public static string SerializeToObject<T>(this T _Object, System.Text.Encoding encoding, Parser.IDataParser<T> dataParser) where T : class, new()
{
return dataParser.SerializeToObject(_Object, encoding);
}
/// <summary>
/// 根据指定路径 解析到指定文本中 encoding 编码格式
/// </summary>
public static void SerializeToObject<T>(this T _Object, System.Text.Encoding encoding, string path, Parser.IDataParser<T> dataParser) where T : class, new()
{
if (File.Exists(path))
{
using (StreamWriter sw = new StreamWriter(path, false))
{
sw.Write(encoding.GetString(encoding.GetBytes(dataParser.SerializeToObject(_Object, encoding))));
}
UnityEngine.Debug.Log("该文件存在,进行覆盖");
}
else
{
UnityEngine.Debug.Log("该文件不存在存在,进行新建");
string content = encoding.GetString(encoding.GetBytes(dataParser.SerializeToObject(_Object, encoding)));
File.WriteAllText(path, content, encoding);
}
}
/// <summary>
/// 反序列化 默认文本格式
/// </summary>
public static T DeserializeToObject<T>(this string path, Parser.IDataParser<T> dataParser) where T : class, new()
{
return DeserializeToObject(path, System.Text.Encoding.UTF8, dataParser);
}
/// <summary>
/// 根据路径 解析文本 encoding 编码格式
/// </summary>
public static T DeserializeToObject<T>(this string path, System.Text.Encoding encoding, Parser.IDataParser<T> dataParser) where T : class, new()
{
if (File.Exists(path))
{
StreamReader sr = new StreamReader(path, encoding);
string data = sr.ReadToEnd();
sr.Dispose();
return dataParser.DeserializeToObject(data, encoding);
}
else
{
UnityEngine.Debug.Log(path + " 该路径不合法");
}
return default(T);
}
}
写个测试类:
JSon测试类:
using System.Collections.Generic;
using UnityEngine;
using Sandboxie.Data;
using Sandboxie.Data.Parser;
using System.Text;
public class JsonToolTest : MonoBehaviour {
private string path = "";
// Use this for initialization
void Start () {
/*** 序列化 ****/
path = Application.streamingAssetsPath + "/JsonTool" + "/aaa.json";
List<Children> childrens = new List<Children>()
{
new Children(){name="张三",sex="女",age="22" },
new Children(){name="李四",sex="男",age="33" },
new Children(){name="齐5",sex="女",age="15" },
new Children(){name="李6",sex="女",age="8" },
};
childrens.SerializeToObject(Encoding.UTF8, path, new JsonParser<List<Children>>());
/***** 反序列化 ******/
var mylist= path.DeserializeToObject(Encoding.UTF8, new JsonParser<List<Children>>());
foreach (var m in mylist)
{
Debug.Log(m.name+":"+m.sex+":"+m.age);
}
}
}
public class Children
{
public string name;
public string sex;
public string age;
}
输出结果:
同理,把JsonParser换成 XMLParser 就变成了XML工具了。
值得注意的点:
1、路径命名 , 如下
path = Application.streamingAssetsPath + "/JsonTool" + "/aaa.json";
如果你用的是XML,--->aaa.xml;同理json---->aaa.json
2,关于编码类型
我这里用的UTF8,也是默认的,当然你也可以改成其他的。
工具连接地址:https://download.csdn.net/download/qq_40120946/10916224