将类型序列化为字典
本文关键字:字典 序列化 类型 | 更新日期: 2023-09-27 18:24:39
我正在尝试将Dictionary<int, int>
序列化为Dictionary<string, string>
。
因此,我从Dictionary<int, int>
创建了Test2
类型,如下所示:
[Serializable]
internal sealed class Test2 : Dictionary<int, int>
{
internal Test2()
{
}
private Test2(SerializationInfo info, StreamingContext context)
{
var data = (Dictionary<string, string>)
info.GetValue("data", typeof(Dictionary<string, string>));
foreach (var item in data)
Add(int.Parse(item.Key), int.Parse(item.Value));
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
var data = new Dictionary<string, string>();
foreach (var item in this)
data[item.Key.ToString()] = item.Value.ToString();
info.AddValue("data", data, typeof(Dictionary<string, string>));
}
}
并使用以下代码来测试序列化:
var test2 = new Test2 {{10, 10}};
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, test2);
stream.Position = 0;
var clone = (Test2) formatter.Deserialize(stream);
}
由于某些原因,克隆不包含任何数据(Count eq为0)。
更新:
"int"answers"string"仅用于测试。在实际的应用程序中,我使用主键而不是字符串,使用大对象而不是int,序列化数组包含它们之间的关系。通过减少不相关的代码并用上面的例子替换我最终使用的类型。
我只能使用.NET框架功能。
在序列化过程中,您不需要将整数转换为字符串,也不需要定义自己的可序列化类-框架会为您处理这些问题。这个代码(从这个问题修改而来)会做你想做的事情:
var test2 = new Dictionary<int, int> { { 10, 10 } } ;
var formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, test2);
stream.Position = 0;
var clone = (Dictionary<int, int>) formatter.Deserialize(stream);
}
我不确定为什么您的原始代码不起作用,但我认为这与SerializationInfo集合无法正确序列化/反序列化字典有关。我用这个使用List<Tuple<string,string>>
代替Dictionary<string,string>
的代码替换了您的类,它运行良好:
[Serializable]
internal sealed class Test2 : Dictionary<int, int>
{
internal Test2()
{
}
private Test2(SerializationInfo info, StreamingContext context)
{
var data = (List<Tuple<string, string>>)
info.GetValue("data", typeof(List<Tuple<string, string>>));
foreach (var item in data)
Add(int.Parse(item.Item1), int.Parse(item.Item2));
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
var data = new List<Tuple<string, string>>();
foreach (var item in this)
data.Add(Tuple.Create(item.Key.ToString(), item.Value.ToString()));
info.AddValue("data", data, typeof(List<Tuple<string, string>>));
}
}