1

次のようにシリアル化コードを設定しました。

    static void SerialiseObject(Object o, String path)
    {
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream(path, FileMode.Create);
        formatter.Serialize(stream, o);
        stream.Close();
    }
    static Object DeserialiseObject(String path)
    {
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
        Object o = (Object)formatter.Deserialize(stream);
        stream.Close();
        return o;
    }

そして、次のメンバーが定義されたクラス:

[Serializable]
public class CircuitModel
{
    public Dictionary<String, Bus> Buses { protected set; get; }
    ...
}

ディクショナリにデータを入力すると、次のコードはディクショナリを正常にシリアライズおよびデシリアライズし、すべてのBusオブジェクトはそのままです。

SerialiseObject(CircuitModel.Buses, "temp.bin");
Object o = DeserialiseObject("temp.bin");

しかし、私が同じことをしようとするとCircuitModel:

SerialiseObject(CircuitModel, "temp.bin");
Object o = DeserialiseObject("temp.bin");

CircuitModel.Busesは初期化されていますが、空です。

ISerializableまた、 (Busおよびクラスの)シリアライゼーションを実装しようとしましCircuitModelたが、まったく同じ問題がありました

なぜこれが起こるのかについて何か考えはありますか?

4

3 に答える 3

2

クラス内の辞書のバイナリシリアル化はうまく機能するため、子コレクションでさらに不吉なことが起こっていると思います。

    [TestFixture]
public class SerializeTest
{

    [Test]
    public void TestSer()
    {
        var parent = new Parent
                        {
                            Name = "Test"
                        };
        parent.Children.Add("Child1", new Child {Name = "Child1"});
        parent.Children.Add( "Child2", new Child { Name = "Child2" } );

        SerialiseObject(parent, "test.bin");
        var copy = DeserialiseObject("test.bin") as Parent;

        Assert.IsNotNull(copy);
        Assert.AreEqual(2, copy.Children.Count);
        Assert.IsTrue(copy.Children.ContainsKey("Child1"));
        Assert.AreEqual("Child1", copy.Children["Child1"].Name);
    }

    static void SerialiseObject( Object o, String path )
    {
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream( path, FileMode.Create );
        formatter.Serialize( stream, o );
        stream.Close();
    }
    static Object DeserialiseObject( String path )
    {
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new FileStream( path, FileMode.Open, FileAccess.Read );
        Object o = (Object) formatter.Deserialize( stream );
        stream.Close();
        return o;
    }

    [Serializable]
    private class Parent
    {
        public string Name { get; set; }
        public Dictionary<string, Child> Children { get; protected set; }

        public Parent()
        {
            Children = new Dictionary<string, Child>();
        }
    }

    [Serializable]
    private class Child
    {
        public string Name { get; set; }
    }
}

子は親で逆シリアル化され、初期化に使用された詳細が含まれます。あなたのBusesコレクションを設定しているコードをチェックします。私の例では、親クラスのコンストラクターでそれを行っただけですが、逆シリアル化された後に不正なコードが設定されている可能性がありますか?

于 2012-11-22T22:05:57.793 に答える
0

辞書はシリアライズできません。そのデータをシリアル化する必要がある場合は、辞書を削除し、辞書内のデータを含むカスタム クラスのリストに置き換えます。

[Serializable]
public class BusItem
{
    public string Name {get;set;}
    public Bus Bus {get;set;}
}

DataContractSerializer編集:代わりにを使用して辞書を実際にシリアル化できることがわかりました。

http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/

于 2012-11-22T21:44:49.657 に答える
-1

XML シリアライゼーションについて話している場合、Dictionary が XML にシリアライズできないことが原因である可能性があります。なぜ .NET に XML シリアル化可能なディクショナリがないのかを見てください。

于 2012-11-22T21:49:45.007 に答える