2

次のような構造になっています

[Serializable]
public class Parent
{
    public int x = 5;
}

[Serializable]
public class Child : Parent
{
    public HashAlgorithm ha; //This is not Serializable

}

次のコードを使用してこれをシリアル化したい:

public class Util {
    static public byte[] ObjectToByteArray(Object obj)
    {
        if (obj == null)
        {
            return null;
        }
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream();
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

Childコード内のタイプのオブジェクトを操作していますが、Childオブジェクト内にシリアル化できないフィールドがあります(例:HashAlgorithm)。Parentしたがって、次のコードを使用してタイプへの変換を試みました。

public byte[] tryToSerialize(Child c)
{
    Parent p = (Parent) c;
    byte[] b = Util.ObjectToByteArray(p);
    return b;
}

ただし、これは、HashAlgorithmこのフィールドを含まない子をシリアル化しようとしたにもかかわらず、シリアル化できないエラーを返します。どうすれば必要なことを達成できますか?

4

2 に答える 2

4

これは不可能です。
クラスをその基本クラスの1つとしてシリアル化することはできません。

[NonSerialized]代わりに、フィールドに追加してください。

于 2011-01-30T03:55:01.520 に答える
3

基本クラスにISerializableを実装してから、次のように派生したものを渡すことができます。

private Child() { } // Make sure you got a public/protected one in Parent

private Child(SerializationInfo info, StreamingContext context) 
     : base(info, context) { }

ISerializableを実装した後、ChildのSerializeメソッドを使用するだけです。

于 2014-04-10T07:13:43.997 に答える