4

私は次のようなタイプをシリアル化しようとしています:

    public UsersPanel(UsersVM userVm)
    {
        var serialized = Serialize(userVm);
    }

    public static string Serialize(ViewModelBase instance)
    {
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, instance); // breaks here
            return Convert.ToBase64String(stream.ToArray());
        }
    }

UsersVMとして定義されている場所

public class UsersVm : ViewModelBase {}

ViewModelBase定義されています

[Serializable]
public class ViewModelBase {}

これにより、次のエラーが発生します。

タイプ「UsersVM」はシリアル化可能としてマークされていません。

オブジェクトをに渡して( SerializableとしてマークされているuserVm)オブジェクトをキャストした場合、なぜこれを通知するのですか?ViewModelBaseSerialize(ViewModelBase instance)

をとるメソッドに渡すときに、受け渡しUsersVMが基本型に置き換えられると思いました。ViewModelBaseViewModelBase

ViewModelBaseをシリアル化するにはどうすればよいですか?

4

1 に答える 1

5

問題を解決する

派生クラスもシリアライズ可能としてマークする必要があります

[Serializable]
public class UsersVm : ViewModelBase {}

なぜこれをしなければならないのか

BinaryFormatter は、シリアル化時にオブジェクト インスタンスの実際の型を調べます。キャストは、インスタンスを別の型であるかのように扱うようにコンパイラに指示するだけで、実際にインスタンスをその型に変更するわけではありません。

サイドノート

私は最初に質問を逆に読んで、逆の質問に対する答えが興味深く、他の人にとって役立つ可能性があることを発見しました...

状況が逆の場合 (基本クラスがシリアル化可能とマークされておらず、ソース コードにアクセスできない場合) も、目標を達成できることに注意してください。

サブクラスは ISerializable を実装し、リフレクションを使用して基本クラスのフィールドを読み取ってシリアル化し、逆シリアル化中にこれらのフィールドを再度リフレクションを使用して設定できます。

http://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S14

この記事では、このアプローチの実装に役立つユーティリティを含むコード サンプルを提供します。

于 2012-07-25T16:09:32.617 に答える