unity JsonUtility和BinaryFormatter区别
时间: 2023-06-20 08:03:52 浏览: 57
Unity中的`JsonUtility`和`BinaryFormatter`都是用来序列化和反序列化数据的工具,但它们有以下区别:
1. 数据格式不同:`JsonUtility`序列化后的数据是一个JSON字符串,而`BinaryFormatter`序列化后的数据是二进制的。
2. 可读性不同:由于`JsonUtility`序列化后的数据是一个JSON字符串,因此它具有可读性,可以直接在文本编辑器中查看和编辑。而`BinaryFormatter`序列化后的数据是一堆二进制数据,不可读。
3. 序列化效率不同:`BinaryFormatter`的序列化和反序列化速度较快,因为它直接将对象转换为二进制数据。而`JsonUtility`的序列化和反序列化速度相对较慢,因为它需要将对象转换为JSON字符串并解析JSON字符串。
4. 序列化精度不同:`JsonUtility`序列化后的数据精度更高,因为JSON字符串可以保留浮点数的小数点后面的位数,而`BinaryFormatter`不能。
综上所述,`JsonUtility`适合序列化和反序列化可读性较高、精度要求较高的数据,例如配置文件;`BinaryFormatter`适合序列化和反序列化性能要求较高、可读性要求不高的数据,例如游戏中的网络数据传输。
相关问题
unity jsonutility.tojson()得到的数据能通过StreamWriter类写入到指定文件中吗?还是要借助binaryformatter
可以通过StreamWriter类将JsonUtility.ToJson()得到的数据写入到指定文件中。StreamWriter类是用于写入文本文件的,而JsonUtility.ToJson()返回的是Json字符串,也是文本格式。因此,可以使用StreamWriter类直接写入Json字符串到文件中。
以下是一个示例代码:
```csharp
using UnityEngine;
using System.IO;
public class JsonWriter : MonoBehaviour
{
[System.Serializable]
public class PlayerData
{
public string name;
public int level;
public float health;
}
void Start()
{
PlayerData player = new PlayerData();
player.name = "John";
player.level = 5;
player.health = 100.0f;
string jsonString = JsonUtility.ToJson(player);
// 创建一个文件流,将数据写入到文件中
using (StreamWriter streamWriter = File.CreateText(Application.dataPath + "/playerData.json"))
{
streamWriter.Write(jsonString);
}
}
}
```
在这个示例中,我们创建了一个PlayerData类,使用JsonUtility.ToJson()将其序列化为Json字符串,并使用StreamWriter类将其写入到文件中。注意,我们使用了File.CreateText()方法创建了一个新的文件流,这个方法会创建一个新的文件并打开它以供写入。如果文件已经存在,它将被覆盖。最后,我们调用StreamWriter.Write()方法写入Json字符串到文件中。
unity序列化和反序列化
Unity中的序列化和反序列化是指将对象转换成二进制数据以便于存储或传输,以及将二进制数据转换回对象的过程。
在Unity中,可以使用以下几种方式来进行序列化和反序列化:
1. JsonUtility:这是Unity提供的一个用于序列化和反序列化JSON格式数据的工具,可以将对象转换成JSON格式的字符串,也可以将JSON格式的字符串转换回对象。
2. BinaryFormatter:这是.NET框架提供的一个用于将对象序列化成二进制数据的工具,可以将对象序列化成二进制数据,也可以将二进制数据反序列化回对象。
3. XMLSerializer:这是.NET框架提供的一个用于将对象序列化成XML格式数据的工具,可以将对象序列化成XML格式的字符串,也可以将XML格式的字符串反序列化回对象。
在使用这些工具进行序列化和反序列化时,需要注意以下几点:
1. 序列化和反序列化的对象需要是可序列化的,即需要添加[Serializable]标记。
2. 序列化和反序列化的字段需要是public或者有getter和setter方法的。
3. 序列化和反序列化的对象需要保持一致,即序列化和反序列化时使用的对象类型需要相同。
4. 序列化和反序列化的对象中不能包含非可序列化的对象,比如委托等。