- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 msdn 上的自定义序列化文章:http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspx
里面提到了实现自定义序列化有两种方式:
1、使用OnDeserializedAttribute、OnDeserializingAttribute、OnSerializedAttribute、OnSerializingAttribute
2、实现ISerializable
接口(interface)
根据 MSDN,方法 #1 是“最佳实践和最简单的方法”,但我不明白这两种方法是怎么回事。据我了解,OnSerializing|OnSerialized|etc
属性允许您将方法挂接到序列化的特定阶段,而 ISerializable
接口(interface)允许您直接修改进入和到来的内容来自 SerializationInfo
。这是正确的吗?
为了解决我的困惑,你如何实现 OnSerializing 来序列化不同名称下的对象字段?像下面的代码:
public virtual void GetObjectData(SerializationInfo info, StreamingContext context){ info.AddValue("i", n1); info.AddValue("j", n2); info.AddValue("k", str);}
更新:尽管 Frederik Gheysels 的回答并不完全正确(使用 Serializable 装饰是 OnSerializing/OnDeserializing 属性和 ISerializable 接口(interface)的先决条件),但他确实指出 OnSerializing/OnDeserializing 属性是意味着是 ISerializable 的补充,所以我接受他在这一点上的回答。
最佳答案
OnSerializing
/OnDeserializing
与 ISerializable
互补或 SerializableAttribute
.
换句话说:OnSerializing
/OnDeserializing
不是 ISerializable
的替代品或 SerializableAttribute
.
这 2 个属性 ( OnSerializing
/OnDeserializing
) 允许您在序列化或反序列化对象时控制/执行额外的操作。但是,为了能够做到这一点,应用这些属性的类型必须是可序列化的(从而实现 ISerializable
接口(interface),或者用可序列化属性修饰)。
这在您所指的 MSDN 文章中也是这样说的:- OnSerializing 和 OnDeserializing 用于在序列化期间和之后“更正”数据。
您可以很容易地测试它。创建这样的类型,并尝试对其进行序列化:
public class Foo
{
private int _bar = 5;
[OnSerializing]
public void OnSerializeFoo( StreamingContext context )
{
_bar = 10;
}
}
请注意,该类型没有实现 ISerializable
, 也没有用 SerializableAttribute
装饰.尝试序列化该类型的实例,您将面临 SerializationException
,因为 Foo
不可序列化。
因此,您可以使用这些属性(OnSerializing、OnDeserializing)来实现在序列化或反序列化特定类型的实例时应执行的附加逻辑。
关于c# - OnSerializingAttribute 与 ISerializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1462936/
我目前正在努力保存更大的对象结构,其中包含我正在处理的应用程序中的“项目”所需的所有数据。数据是诸如图片、流文档以及更基本的数据类型之类的东西。 现在,我目前的方法是在我需要保存的对象中包含的所有类上
我有一个类,其中包含我正在序列化的一些数据: [Serializable] public class SomeData { public int NumericField; publi
我必须使用一个旧应用程序,该应用程序使用 binaryFormatter 将应用程序数据序列化为文件流(例如在名为“data.oldformat”的文件中) 没有任何优化,主类已用属性标记 publi
考虑以下类的 POD 类型: public class Price { public decimal OfferPrice { get; set; } } 此类的对象是从服务器检索的,所以让我们用可序
我打算使用序列化来做克隆。我必须让我的类 ISerializable。但是它的父类(super class)和所有引用的变量类呢?我需要让它们全部 ISerializable 吗? 如果我使用 ISe
ISerializable 接口(interface)只提供了一种序列化对象的方法。反序列化进程由构造函数管理。 问题是,构造函数不能返回实例,因为构造函数创建了一个新实例。 在我的实现中,有几个属性
我们的任务非常简单,我们有一个对象图,其中每个对象 (IDItem) 都有一个唯一的 ID。对象图存在两次,在客户端和服务器机器上。 现在我们将一些可序列化的命令传递给服务器。该命令具有一些 IDIt
我正在编写自己的 IFormatter 实现,但我想不出一种方法来解决两种都实现 ISerializable 的类型之间的循环引用。 这是通常的模式: [Serializable] class Foo
我们有一个遗留类A,它是[Serializable],但不是ISerializable。由于各种原因,必须修补此类以实现 ISerializable。 问题是我们仍然需要能够加载旧的保存文件,这些文件
我想为包含相似类型子项列表的 C# 类实现 ISerializable。考虑以下示例: using System; using System.Collections.Generic; using Sy
我很难理解 ISerializable 接口(interface)的必要性......我想我在这个主题中遗漏了一些非常重要的东西,所以如果有人能帮助我,我将不胜感激。 这很好用- [Serializa
我有扩展方法 public static T DeepClone(this T source) where T : ISerializable { .. } 当我添加“where T : I
我正在尝试使用 Iserializable 在 Android 中传递对象,但它返回“无法从 native 句柄激活类型的实例”异常。 下面是我的代码。 [FBUserParcel.cs] using
我正在编写自定义序列化程序,我刚刚完成了用于处理 ISerializable.GetObjectData 的部分的实现。但是当我去反序列化信息并将其重新应用于图形时,我没有看到 Set-ObjectD
我正在阅读 msdn 上的自定义序列化文章:http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspx 里面提到了实现自定义序列化
我必须在派生类中实现 ISerializable(以执行一些自定义序列化/反序列化),但父类被标记为 [Serializable]。序列化“有效”(我可以序列化和反序列化而不会出现运行时错误)但看起来
我有一组用户定义的类型,它们已经实现了 ISerializable 接口(interface),现在我想将它们托管在服务器端应用程序中,并通过使用 DataContract 属性标记它们来向客户端公开
我有一个看起来像这样的包装列表: [JsonObject(MemberSerialization.Fields)] public class OrderManager : IEnumerable, I
我对继承类中 ISerializable 的正确实现有疑问。 我有两个类,AbstractBaseClass 及其实现 BaseClass。在实现派生自 BaseClass 的 FinalClass
我有一个类通过 XLINQ 实现它自己的(反)序列化,我会喜欢让我类(class)的客户尝试对我的类(class)进行 XMLSerialze而是调用了我的 XLINQ 方法。 这可能吗? 最佳答案
我是一名优秀的程序员,十分优秀!