在运行时将对象更改为可序列化的.NET

时间:2012-11-07 16:54:28

标签: c# .net serialization

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

这样的东西
<!-- language: c# -->
var nonSerializeObject = new NonSerialize();
ISerializable mySerializeObject = 
      somethingforserializable.serialize(nonSerializeObject,TypeOfObject);

4 个答案:

答案 0 :(得分:2)

您可以创建一个可以序列化(转换为其他表示形式)对象的类,但是无法在运行时向类添加接口(例如ISerializable)。

System.Xml.Serialization.XMLSerializer课程可以序列化您的课程,而不会实施ISerializable[Serializable]

答案 1 :(得分:2)

不可能。最好的办法是使用XML序列化或实现自己的序列化函数,这些函数使用反射来读取对象中的所有字段(请注意,反射只返回当前类型的私有字段,因此您必须手动遍历类型层次结构)。

您的出发点是nonSerializeObject.GetType().GetFields()方法。

答案 2 :(得分: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));
    }
}

现在,我还没有尝试过,它可能无法完全适用于以不寻常的方式存储数据的某些类。例如,我只获取私有字段,而某些类可能有公共字段。 (不寻常,但可能发生)

如果嵌套对象也不可序列化,也可能会遇到一些问题。但是,您可以检测到并自动创建信封并在反序列化时重建层次结构。

答案 3 :(得分:1)

您无法添加从运行时派生的属性或接口/类。虽然取决于你如何序列化,但可能甚至不需要它们。