0

我想在运行时将对象更改为 ISerializable。就像是

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

4 回答 4

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 回答
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 回答
1

您不能添加从运行时派生的属性或接口/类。尽管取决于您的序列化方式,但它们甚至可能不需要。

于 2012-11-07T16:56:49.713 回答