我想在运行时将对象更改为 ISerializable。就像是
<!-- language: c# -->
var nonSerializeObject = new NonSerialize();
ISerializable mySerializeObject =
somethingforserializable.serialize(nonSerializeObject,TypeOfObject);
我想在运行时将对象更改为 ISerializable。就像是
<!-- language: c# -->
var nonSerializeObject = new NonSerialize();
ISerializable mySerializeObject =
somethingforserializable.serialize(nonSerializeObject,TypeOfObject);
ISerializable
您可以创建一个可以序列化(转换为其他表示形式)对象的类,但无法在运行时向类添加接口(例如)。
该类System.Xml.Serialization.XMLSerializer
可以序列化您的类,而无需实现ISerializable
或成为[Serializable]
.
不可能。您最好的选择是使用 XML 序列化或实现您自己的序列化函数,这些函数使用反射从对象中读取所有字段(请注意,反射仅返回当前类型的私有字段,因此您必须手动遍历类型层次结构)。
你的出发点是nonSerializeObject.GetType().GetFields()
方法。
很抱歉,您不能在运行时添加接口。
能够放置一个对象来实现 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));
}
}
现在,我还没有尝试过,它可能无法完全适用于某些以不寻常方式存储数据的类。例如,我只获取私有字段,而某些类可能有公共字段。(不寻常,但可能发生)
如果嵌套对象也不可序列化,您也可能会遇到一些问题。但是,您可以检测到这一点并自动创建信封并在反序列化时重建层次结构。
您不能添加从运行时派生的属性或接口/类。尽管取决于您的序列化方式,但它们甚至可能不需要。