我想序列化包含不同类型对象的字典(动态)并将其保存到文件中。加载文件时,软件需要再次将数据反序列化为Dictionary并设置对象引用。当我尝试设置一个对象时,它给了我错误:
无法将类型'Newtonsoft.Json.Linq.JObject'隐式转换为 “ PartyCreator.Member”。
反序列化词典似乎正在运行,例如,我可以使用loadedObjects["member1"].Name
访问member1属性,但不能将该对象引用到通过我自己的Member类创建的现有对象member1。
// Serializing the Dictionary
Dictionary<string, dynamic> savedObjects = new Dictionary<string, dynamic>();
savedObjects.Add("member1", member1);
savedObjects.Add("member2", member2);
savedObjects.Add("member3", member3);
savedObjects.Add("member4", member4);
var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() };
var saveData = JsonConvert.SerializeObject(savedObjects, settings);
// DeSerializing the Dictionary
Dictionary<string, dynamic> loadedObjects = new Dictionary<string, dynamic>();
loadedObjects = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(saveData);
member1 = loadedObjects["member1"]; // Giving an error: Cannot implicitly convert type 'Newtonsoft.Json.Linq.JObject' to 'PartyCreator.Member'
// These are the settings i'm using with Json Serializer
public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Select(p => base.CreateProperty(p, memberSerialization))
.Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Select(f => base.CreateProperty(f, memberSerialization)))
.Where(p => !p.PropertyName.Contains("k__BackingField"))
.ToList();
props.ForEach(p => { p.Writable = true; p.Readable = true; });
return props;
}
}