我有一种情况,我需要序列化一个对象,但不想序列化它的任何引用。这是因为我事先并不知道对象可能引用哪些dll,因此无法确保它们是可序列化的对象。这是因为需要序列化插件以保持其状态。
我认为这是XML序列化(浅层)的情况吗?但是这会忽略对象中的任何私有 - 这不是我想要的?
这有可能吗?
答案 0 :(得分:1)
Xml序列化仅适用于可公开访问的内容。此外,除非您使用[XmlIgnore]
属性标记公共属性/字段,否则 将被序列化。
如果您只是查看某些序列化方法,请使用二进制序列化。它将序列化对象的内部状态(所有字段,私有或其他)。如果需要,可以使用[NonSerialized]
属性忽略特定引用。
答案 1 :(得分:0)
如果您在类型声明时知道哪些引用不应序列化,则可以使用二进制序列化并使用[NonSerialized]属性过滤掉成员。
答案 2 :(得分:0)
将NonSerialized属性放在二进制和XmlIgnore属性的情况下,以便xml序列化引用属性或字段
答案 3 :(得分:0)
你知道哪些属性可以序列化,但是,对吗?这些插件是否实现了通用接口?如果是这种情况,您应该能够编写一个通用的序列化程序,它只会序列化您选择的特定属性。
这是一个基本示例,可让您了解需要执行的操作: Object Serialization using C#
如果您只是想在类实例中序列化本机类型,那么您应该能够实现ISerializable,并装饰您不希望序列化的属性。
答案 4 :(得分:0)
您可以尝试这样的事情:
Type myType = currentObject.GetType();
然后使用以下方法检查对象是否可序列化:
myType.IsSerializable; //returns a bool
这应该告诉你对象是否可序列化。如果你真的需要知道类中的每个单个对象是否可序列化,例如其他嵌套类或自定义类型,那么你可以使用反射来读取每个对象,使用上面的代码,并验证它是否可序列化。然而,这可能是一种更复杂的方法,并且可能不合理,特别是如果您有需要处理的开销问题。
答案 5 :(得分:0)
将您要坚持的内容与坚持下去的内容分开可能很有用。
您似乎希望控制您希望如何保留数据,但显然,由于您的插件模型,无法知道它是什么。
可能对您有意义的一种方案是为您的插件提供某种对象或接口,它们可以在保存/加载时写入和读取。记录这些限制很好。
例如,在持久化时,允许您的插件传递给您:
每个插件存储此信息(以您想要的任何形式),然后重新加载,传回相同的信息。
这只是一种方法,最终插件知道它需要保存什么,并且需要拥有这条信息。