使用 Json.NET 对类型 T 进行序列化和反序列化,派生自 Dictionary<string, T>
Serializing and deserializing of type T, derived from Dictionary<string, T>, using Json.NET
我创建了一个示例项目。我正在序列化以下类型:
[JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public class SampleTree : Dictionary<string, SampleTree>
{
[JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleClass Value { get; set; }
[JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleTree Parent { get; set; }
}
[JsonObject(IsReference = true)]
public class SampleClass
{
public string A { get; set; }
public int B { get; set; }
public bool C { get; set; }
}
程序代码(为简单起见,控制台应用程序):
static void Main(string[] args)
{
var tree = new SampleTree
{
Value = new SampleClass
{
A = "abc",
B = 1,
C = true
},
Parent = null
};
var treeChild = new SampleTree
{
Value = new SampleClass
{
A = "def",
B = 2,
C = false
},
Parent = tree
};
tree.Add("firstChild", treeChild);
var serializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.All,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
Formatting = Formatting.Indented
};
var serialized = JsonConvert.SerializeObject(tree, serializerSettings);
var deserialized = JsonConvert.DeserializeObject<SampleTree>(serialized, serializerSettings);
var d = deserialized;
}
序列化的结果非常完美:结果字符串包含我之前放入树中的所有数据。但是,使用相同的序列化程序设置对该字符串进行反序列化是不正确的:结果对象根本没有子对象。也许主要问题是属性...这样的行为的原因是什么?
我不确定这是你需要的。
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, SampleTree> tree = new Dictionary<string, SampleTree>();
var a = new SampleTree
{
Value = new SampleClass
{
A = "abc",
B = 1,
C = true
},
Parent = null
};
var treeChild = new SampleTree
{
Value = new SampleClass
{
A = "def",
B = 2,
C = false
},
Parent = a
};
tree.Add("parent", a);
tree.Add("child", treeChild);
var serializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.All,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
Formatting = Formatting.Indented
};
var serialized = JsonConvert.SerializeObject(tree, serializerSettings);
var deserialized = JsonConvert.DeserializeObject<Dictionary<string, SampleTree>>(serialized, serializerSettings);
var d = deserialized;
}
}
[JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public class SampleTree
{
[JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleClass Value { get; set; }
[JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleTree Parent { get; set; }
}
[JsonObject(IsReference = true)]
public class SampleClass
{
public string A { get; set; }
public int B { get; set; }
public bool C { get; set; }
}
}
这对我来说完美无缺。让我知道这是否是您想要的。
我没有在 Main 函数中声明 Dictionary,而是向 SampleTree 本身添加了一个 属性 名为 Children 的 Dictionary 类型(并删除了对 c 的继承)。
我创建了一个示例项目。我正在序列化以下类型:
[JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public class SampleTree : Dictionary<string, SampleTree>
{
[JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleClass Value { get; set; }
[JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleTree Parent { get; set; }
}
[JsonObject(IsReference = true)]
public class SampleClass
{
public string A { get; set; }
public int B { get; set; }
public bool C { get; set; }
}
程序代码(为简单起见,控制台应用程序):
static void Main(string[] args)
{
var tree = new SampleTree
{
Value = new SampleClass
{
A = "abc",
B = 1,
C = true
},
Parent = null
};
var treeChild = new SampleTree
{
Value = new SampleClass
{
A = "def",
B = 2,
C = false
},
Parent = tree
};
tree.Add("firstChild", treeChild);
var serializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.All,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
Formatting = Formatting.Indented
};
var serialized = JsonConvert.SerializeObject(tree, serializerSettings);
var deserialized = JsonConvert.DeserializeObject<SampleTree>(serialized, serializerSettings);
var d = deserialized;
}
序列化的结果非常完美:结果字符串包含我之前放入树中的所有数据。但是,使用相同的序列化程序设置对该字符串进行反序列化是不正确的:结果对象根本没有子对象。也许主要问题是属性...这样的行为的原因是什么?
我不确定这是你需要的。
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, SampleTree> tree = new Dictionary<string, SampleTree>();
var a = new SampleTree
{
Value = new SampleClass
{
A = "abc",
B = 1,
C = true
},
Parent = null
};
var treeChild = new SampleTree
{
Value = new SampleClass
{
A = "def",
B = 2,
C = false
},
Parent = a
};
tree.Add("parent", a);
tree.Add("child", treeChild);
var serializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.All,
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
Formatting = Formatting.Indented
};
var serialized = JsonConvert.SerializeObject(tree, serializerSettings);
var deserialized = JsonConvert.DeserializeObject<Dictionary<string, SampleTree>>(serialized, serializerSettings);
var d = deserialized;
}
}
[JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public class SampleTree
{
[JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleClass Value { get; set; }
[JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public SampleTree Parent { get; set; }
}
[JsonObject(IsReference = true)]
public class SampleClass
{
public string A { get; set; }
public int B { get; set; }
public bool C { get; set; }
}
}
这对我来说完美无缺。让我知道这是否是您想要的。
我没有在 Main 函数中声明 Dictionary,而是向 SampleTree 本身添加了一个 属性 名为 Children 的 Dictionary 类型(并删除了对 c 的继承)。