我可以避免在类中添加其他字段来存储仅用于反序列化/序列化所需的数据吗?
假设我有一些课程:
[Serializable]
class MyClass {
[NonSerialized]
NonSerializableDataType myField;
SomeOtherDataType serializableTemporaryData;
[OnSerializing]
OnSerializing (StreamingContext context) {
// build serializableTemporaryData from myField
}
[OnDeserialized]
void OnDeserialized (StreamingContext context) {
// build myField from serializableTemporaryData
}
}
有没有办法避免在serializableTemporaryData
的每个对象中使用MyClass
字段?例如,我可以将其设置为静态(可能通过更改我的On ...方法)吗?
约束:我无法更改NonSerializableDataType
的实现。
示例:假设myField包含资源的句柄。然后,在序列化时,我必须存储一些有关如何在反序列化后获取资源的信息,但我无法存储句柄本身。如果我将句柄包装到另一个类中,那么我刚刚将问题转移到了包装类 - 那么我会问包装类的相同问题。
答案 0 :(得分:5)
如果需要控制序列化过程,则应实现ISerialization
接口。
[Serializable]
public class MyClass: ISerializable
{
// As you are in control of serialization process now
// [Serialized] and [NonSerialized] attributes are no longer required
private NonSerializableDataType myField;
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
// Create and populate your SomeOtherDataType local variable here, then push it into info variable
// Or even better, dont create SomeOtherDataType, just put additional serialization data into info variable, for example:
info.AddValue("URL", "http://this.way.com");
}
protected MyClass(SerializationInfo info, StreamingContext context)
{
// Dont forget to define constructor for deserialization purpose
this.myField = new NonSerializableDataType(loadFromURL: (string)info.GetValue("URL", typeof(string)));
}
}
没有额外的类仅用于序列化数据,没有字段污染。唯一可能的问题是要注意从这个类派生的任何可序列化数据(如果需要,覆盖GetObjectData(...)
)。
更多信息:MSDN ISerializable
答案 1 :(得分:3)
serialization surrogates有一个概念可以帮助您克服SomeNonSerializableType
的难度,因为它的设计正是出于这个原因。但是,这要求您有可能配置序列化代理,创建格式化程序时。否则,您需要通过实现ISerializable
来自定义序列化过程。