YAML支持
-
导入插件:YamlDotNet for Unity
-
序列化
- 核心方法:
Serializer.Serialize()
输出序列化结果的字符串,写入本地yaml文件
反序列化
-
核心方法:
Deserializer.Deserializ()
读取本地yaml文件,反序列化成目标对象 -
注意:反序列化的对象一定要有默认的构造函数,否则报错无法反序列化。
完整示例
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using YamlDotNet.Serialization;
using Object = System.Object;
public class YamlSample : MonoBehaviour
{
private class MyClass
{
public string Grade {
get; set; } // 年级
public string ClassName {
get; set; } // 班名
public string Teacher {
get; set; } // 班主任
public List<Student> Students {
get; set; } // 学生
public MyClass() {
}
public MyClass(string grade, string className, string teacher, List<Student> students)
{
Grade = grade;
ClassName = className;
Teacher = teacher;
Students = students;
}
}
private class Student
{
public string Name {
get; set; } // 姓名
public string StudentID {
get; set; } // 学号
public float Height {
get; set; } // 身高
public Student() {
}
public Student(string name, string stuID, float height)
{
Name = name;
StudentID = stuID;
Height = height;
}
}
// Start is called before the first frame update
void Start()
{
// 【示例: 对象 序列化 Yaml】
// 创建对象
List<Student> myStudents = new List<Student>();
Student student01 = new Student("小明", "01", 1.74f);
Student student02 = new Student("小红", "02", 1.66f);
Student student03 = new Student("小黄", "03", 1.87f);
myStudents.Add(student01);
myStudents.Add(student02);
myStudents.Add(student03);
MyClass myClass = new MyClass(
"五年级",
"(1)班",
"李老师",
myStudents
);
// 序列化为yaml文件
SerializeYaml(myClass, "C:/Users/xxx/xxx/output.yaml");
// 【示例: Yaml 反序列化 对象】
// 读取yaml文件反序列化
MyClass desMyClass = DeserializeYAML<MyClass>("C:/Users/xxx/xxx/output.yaml");
// 结果显示
Debug.Log("Yaml反序列化结果");
Debug.Log($"年级:{
desMyClass.Grade},班级:{
desMyClass.ClassName},班主任{
desMyClass.Teacher}, 学生有:");
foreach (var student in desMyClass.Students)
{
Debug.Log($"姓名:{
student.Name},学号:{
student.StudentID},身高:{
student.Height}");
}
}
/// <summary>
/// 序列化成YAML
/// </summary>
/// <param name="obj"></param>
/// <param name="path"></param>
private void SerializeYaml(Object obj, string path)
{
try
{
Serializer yamlSerializer = new Serializer();
string outputYaml = yamlSerializer.Serialize(obj);
// 结果输出
File.WriteAllText(path, outputYaml);
}
catch (Exception e)
{
Debug.LogWarning(e);
}
}
/// <summary>
/// 反序列化YAML
/// </summary>
/// <param name="path"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private T DeserializeYAML<T>(string path)
{
try
{
string yamlContent = String.Empty;
if (File.Exists(path))
{
yamlContent = File.ReadAllText(path);
}
Deserializer yamlDeserializer = new Deserializer();
T obj = yamlDeserializer.Deserialize<T>(yamlContent);
return obj;
}
catch (Exception e)
{
Debug.LogWarning(e);
throw;
}
}
}
-
序列化结果截图
-
反序列化结果截图