0

実行時にオブジェクトを ISerializable に変更したいと思います。何かのようなもの

<!-- language: c# -->
var nonSerializeObject = new NonSerialize();
ISerializable mySerializeObject = 
      somethingforserializable.serialize(nonSerializeObject,TypeOfObject);
4

4 に答える 4

2

申し訳ありませんが、実行時にインターフェイスを追加することはできません。

ISerializable を実装するオブジェクトを配置できるからといって、それを正しく実装できるわけではありません。

でも...

リフレクションを使用して、クラスのすべてのフィールドを取得し、手動でシリアル化できます。おそらく、シリアル化可能なエンベロープとして機能するジェネリック クラス内に配置することによって。

このようなもの:

public class SerializableEnvelope<T> : ISerializable
{
    private T item;

    public T Item
    {
        get { return item; }
    }

    public SerializableEnvelope(T _item)
    {
        item = _item;
    }

    public SerializableEnvelope(SerializationInfo info, StreamingContext context)
    {
        item = Activator.CreateInstance<T>();

        FieldInfo[] fields = typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

        foreach (FieldInfo field in fields)
            field.SetValue(item, info.GetValue(field.Name, field.FieldType));
    }

    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        FieldInfo[] fields = typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

        foreach (FieldInfo field in fields)
            info.AddValue(field.Name, field.GetValue(item));
    }
}

現在、私はそれを試していませんが、通常とは異なる方法でデータを保存する一部のクラスでは完全に機能しない可能性があります。たとえば、私はプライベート フィールドのみを取得していますが、一部のクラスにはパブリック フィールドがある場合があります。(異常ですが、起こりうることです)

ネストされたオブジェクトもシリアル化できない場合、問題が発生する可能性があります。ただし、それを検出してエンベロープを自動的に作成し、逆シリアル化で階層を再構築することができます。

于 2012-11-07T16:58:06.883 に答える
2

オブジェクトをシリアル化 (他の表現に変換) できるクラスを作成できますが、実行時にクラスにインターフェイス ( などISerializable) を追加する方法はありません。

クラスは、実装またはされていなくても、System.Xml.Serialization.XMLSerializerクラスをシリアル化できます。ISerializable[Serializable]

于 2012-11-07T16:55:57.433 に答える
2

ありえない。最善の策は、XML シリアル化を使用するか、リフレクションを使用してオブジェクトからすべてのフィールドを読み取る独自のシリアル化関数を実装することです (ただし、リフレクションは現在の型のプライベート フィールドのみを返すため、型階層を手動でトラバースする必要があることに注意してください)。

あなたの出発点はnonSerializeObject.GetType().GetFields()方法です。

于 2012-11-07T16:56:21.707 に答える
1

ランタイムから派生する属性またはインターフェイス/クラスを追加することはできません。ただし、シリアル化の方法によっては、必要ない場合もあります。

于 2012-11-07T16:56:49.713 に答える