我想在运行时将对象更改为ISerializable。像
这样的东西<!-- language: c# -->
var nonSerializeObject = new NonSerialize();
ISerializable mySerializeObject =
somethingforserializable.serialize(nonSerializeObject,TypeOfObject);
答案 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)
您无法添加从运行时派生的属性或接口/类。虽然取决于你如何序列化,但可能甚至不需要它们。