序列化对象但没有引用c#

时间:2009-07-28 16:12:18

标签: c# serialization reference

我有一种情况,我需要序列化一个对象,但不想序列化它的任何引用。这是因为我事先并不知道对象可能引用哪些dll,因此无法确保它们是可序列化的对象。这是因为需要序列化插件以保持其状态。

我认为这是XML序列化(浅层)的情况吗?但是这会忽略对象中的任何私有 - 这不是我想要的?

这有可能吗?

6 个答案:

答案 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)

将您要坚持的内容与坚持下去的内容分开可能很有用。

您似乎希望控制您希望如何保留数据,但显然,由于您的插件模型,无法知道它是什么。

可能对您有意义的一种方案是为您的插件提供某种对象或接口,它们可以在保存/加载时写入和读取。记录这些限制很好。

例如,在持久化时,允许您的插件传递给您:

  1. 一些任意字节数组,它们负责序列化/反序列化。然后,插件的责任是确保它们使用可适当序列化的对象。
  2. 字符串字典
  3. 一个xml文件
  4. 其他...
  5. 每个插件存储此信息(以您想要的任何形式),然后重新加载,传回相同的信息。

    这只是一种方法,最终插件知道它需要保存什么,并且需要拥有这条信息。