【发布时间】:2015-02-24 14:41:25
【问题描述】:
我有一个字典,我将其序列化为二进制文件,然后使用来自https://json.codeplex.com/ 的 JSON .net 再次反序列化
字典可能包含任意对象(字符串、类,甚至列表)。每个类都是[System.Serializable]
在序列化时,我添加了 serializer.TypeNameHandling = TypeNameHandling.All;确保反序列化器具有反序列化字典所需的类型信息。
我无法将其正确反序列化为相同的对象列表,我只能在容器中获取 JObjects 而不是原始类型。谁能帮我完成这个?
提前致谢; 洛朗
更新:
要输入/输出数据,我使用以下两种方法:
public static byte[] SerializeToByteArray<T>(T data)
{
byte[] serializedData = new byte[]{};
using(var stream = new MemoryStream())
{
using (BsonWriter writer = new BsonWriter(stream))
{
JsonSerializer serializer = new JsonSerializer();
serializer.TypeNameHandling = TypeNameHandling.All;
serializer.Serialize(writer, data);
}
return stream.ToArray();
}
}
public static T DeserializeFromByteArray<T>(byte[] serializedData )
{
using (var stream = new MemoryStream(serializedData))
{
using (BsonReader reader = new BsonReader(stream))
{
JsonSerializer serializer = new JsonSerializer();
return (T)serializer.Deserialize<T>( reader );
}
}
}
[System.Serializable]
public class FavoriteLevel
{
public FavoriteLevel(string ID, int TYPE) { id = ID; type = TYPE;}
public string id;
public int type;
}
Dictionary<string,object> dict = new Dictionary<string,object>(1);
List<FavoriteLevel> levels = new List<FavoriteLevel>(1);
levels.Add (new FavoriteLevel("123",FavoriteType.Favorite) );
dict.Add ( "123", levels );
byte[] data = SerializeToByteArray( dict );
Dictionary<string,object> incomingDict = DeserializeFromByteArray<Dictionary<string,object>>( data );
object listBack = incomingDict["123"];
// ERROR: listBack is a Json object and not a List<FavoriteLevel> object
【问题讨论】:
-
你能提供一个简短的例子来重复你遇到的问题吗?
-
嗨 Andrew,刚刚用一些代码更新了帖子
-
@sdpgames 您没有使用 JSON.NET,您使用的是内置的 json 序列化程序。试试
JsonConvert.DeserializeObject<>()或JsonConvert.SerializeObject() -
@CallumLinington:我不太确定——JSON.NET 确实有一个
JsonSerializer类...newtonsoft.com/json/help/html/… -
@CallumLinington:它使用来自 JSON.NET 的正确代码,此语法也来自库创建者:james.newtonking.com/archive/2009/12/26/…
标签: c# .net json unity3d json.net