ToListオプションを使用して辞書の値をシリアル化しようとしました。 デシリアライズ処理で、私がシリアル化したすべてのオブジェクトにnullが付いていることがわかりました メモリストリームを使用したときに発生せず、辞書の型として.Netオブジェクトを使用したときに発生しませんでした。 0-0 辞書:1-1 リスト:0 リスト:1 辞書:0 - ヌル 辞書:1- 以下は、私はそれが問題を示して作成したサンプルコードである このコードの出力は 辞書ヌル リスト:0Dictionary ToListシリアル化の問題
class Program
{
static void Main(string[] args)
{
A state = new A();
Stream stream = File.Open("D:\\temp\\temp.txt", FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, state);
stream.Close();
state.PrintData();
stream = File.Open("D:\\temp\\temp.txt", FileMode.Open);
bFormatter = new BinaryFormatter();
state = (A)bFormatter.Deserialize(stream);
stream.Close();
state.PrintData();
}
}
[Serializable()]
public class A : ISerializable
{
Dictionary<int, B> dic = new Dictionary<int, B>();
List<B> list = new List<B>();
public A()
{
for (int i = 0; i < 4; i++)
{
dic.Add(i, new B(i));
list.Add(new B(i));
}
}
public void PrintData()
{
foreach (KeyValuePair<int, B> kvp in dic)
{
Console.WriteLine("Dictionary: " + kvp.Key.ToString() + "-" + ((kvp.Value != null) ? kvp.Value.ToString() : "Null"));
}
foreach(B b in list)
{
Console.WriteLine("List: " + b.ToString());
}
}
public A(SerializationInfo info, StreamingContext context)
{
List<int> keys = info.GetValue("keys", typeof(List<int>)) as List<int>;
List<B> values = info.GetValue("values", typeof(List<B>)) as List<B>;
int count = keys.Count;
if(count == values.Count)
{
for(int i = 0; i < count; i++)
{
dic[keys[i]] = values[i];
}
}
list = info.GetValue("list", typeof(List<B>)) as List<B>;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("keys", dic.Keys.ToList(), typeof(List<int>));
info.AddValue("values", dic.Values.ToList(), typeof(List<B>));
List<B> listFromDic = new List<B>(dic.Values.ToList());
info.AddValue("list", listFromDic, typeof(List<B>));
}
}
[Serializable()]
public class B : ISerializable
{
int foo;
public B(int i)
{
foo = i;
}
public B(SerializationInfo info, StreamingContext context)
{
foo = info.GetInt32("foo");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("foo", foo);
}
public override string ToString()
{
return (foo != null) ? foo.ToString() : String.Empty;
}
}
なぜあなたはリストとして辞書をシリアライズしようとしていますか? 'Dictionary'は直接シリアライズ可能です。 – svick
.NET4で辞書のシリアル化が変更され、古いシリアル化をサポートするための問題があります –
こんにちは、Shimi、「.NET4では辞書のシリアル化が変更され、古いシリアル化をサポートするための問題があります」と強調したいですか? 。だから、他の視聴者はそれを知っているだろう。私は、ネット4の前方互換性が.net 2.0よりも良いと思った。 – findcaiyzh