Unity Json.net bson自引用循环

问题描述 投票:0回答:1

我正在尝试通过Json.net在游戏中保存内容。使用this资源,我将游戏保存为JSON,但现在我想将其保存为Bson格式,因为我不希望我的玩家能够轻松编辑保存文件。

这是代码的工作原理,并将我的游戏数据保存到json。

File.WriteAllText(path, JsonConvert.SerializeObject(objectToSave, Formatting.Indented,
    new JsonSerializerSettings
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    }));

[我在这里尝试以bson格式保存我的游戏数据,但我不太了解如何以bson格式关闭ReferenceLoopHandling。

using (var stream = new MemoryStream())
{
    var serializer = new JsonSerializer();
    var writer = new BsonWriter(stream);
    serializer.ReferenceLoopHandling.Equals(false);
    serializer.Serialize(writer, objectToSave);

    File.WriteAllText(path, serializer.ToString());
}

当我运行此代码时,出现以下错误。

JsonSerializationException: Self referencing loop detected for property 'graph' with type 'StoryGraph'. Path 'nodes[0]'.

unity3d json.net bson
1个回答
1
投票

您可以使用工厂方法JsonSerializer.CreateDefault(JsonSerializerSettings)JsonSerializer.CreateDefault(JsonSerializerSettings)制造具有所需设置的序列化器,然后使用以下扩展方法直接序列化为文件:

JsonSerializer.Create(JsonSerializerSettings)

然后按如下所示进行序列化:

JsonSerializer.Create(JsonSerializerSettings)

注意:

  • 反序列化时请确保使用相同的设置。

  • BSON支持已移至Json.NET public static partial class BsonExtensions { // In Json.NET 10.0.1 and later use https://www.nuget.org/packages/Newtonsoft.Json.Bson public static void SerializeToFile<T>(T obj, string path, JsonSerializerSettings settings = null) { using (var stream = new FileStream(path, FileMode.Create)) using (var writer = new BsonWriter(stream)) // BsonDataWriter in Json.NET 10.0.1 and later { JsonSerializer.CreateDefault(settings).Serialize(writer, obj); } } public static T DeserializeFromFile<T>(string path, JsonSerializerSettings settings = null) { using (var stream = new FileStream(path, FileMode.Open)) using (var reader = new BsonReader(stream)) // BsonDataReader in Json.NET 10.0.1 and later { var serializer = JsonSerializer.CreateDefault(settings); //https://www.newtonsoft.com/json/help/html/DeserializeFromBsonCollection.htm if (serializer.ContractResolver.ResolveContract(typeof(T)) is JsonArrayContract) reader.ReadRootValueAsArray = true; return serializer.Deserialize<T>(reader); } } } 中其自己的程序包BsonExtensions.SerializeToFile(objectToSave, path, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); 中。在此版本或更高版本中,您应该使用Newtonsoft.Json.Bson(和Newtonsoft.Json.Bson),因为10.0.1已过时,最终将被删除。

  • 10.0.1不会返回序列化的BSON;而是使用BsonDataWriter,即

    BsonDataWriter

    但是,如上面扩展方法中所示,直接流式传输到文件更有效。

  • BsonDataReader不是在c#中设置BsonDataReader属性的正确方法。而是将其设置为好像是一个字段:

    BsonWriter

    请参阅:BsonWriter

演示小提琴serializer.ToString()

© www.soinside.com 2019 - 2024. All rights reserved.