我正在尝试通过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]'.
您可以使用工厂方法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()
。