首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C# 特性(Attribute)之Serializable特性

至于如何序列化,各种序列化类各自有各自的做法,它们只是读取这个标签而已,之后就按照自己的方式去序列化,例如某个应用程序会反射目标对象的类型的所有Field和Property,看看它是否实现了ISerializable...以下代码示例说明了如何在前一部分中提到的 MyObject 类上实现 ISerializable。...需要强调的是,将 ISerializable 添加至某个类时,需要同时实现 GetObjectData 以及特殊的构造函数。如果缺少 GetObjectData,编译器将发出警告。...但是,由于无法强制实现构造函数,所以,缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类,将会出现异常。...由于序列化涉及的是成员变量而非接口,所以,在向要跨版本序列化的类中添加成员变量,或从中删除变量时,应谨慎行事。特别是对于未实现 ISerializable 的类更应如此。

2.4K100

学习总结——关于C#中的序列化

例如,假设某个类用一个成员变量来存储线程 ID。当此类被反序列化时,序列化此类时所存储的 ID 对应的线程可能不再运行,所以对这个值进行序列化没有意义。...要实现 ISerializable,需要实现 GetObjectData 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。...以下代码示例说明了如何在前一部分中提到的 MyObject 类上实现 ISerializable。...需要强调的是,将 ISerializable 添加至某个类时,需要同时实现 GetObjectData 以及特殊的构造函数。如果缺少 GetObjectData,编译器将发出警告。...但是,由于无法强制实现构造函数,所以,缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类,将会出现异常。

89331
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    运行时序列化 2

    对于已经实现了ISerializable接口和特殊构造器的类型,当我们定义它的派生类的时候,必须保证调用基类的GetObjectData方法和特殊构造器。否则对象是不能正确序列化和反序列化的。...如果你的派生类中没有任何额外的字段,因而没有特殊的序列化/反序列化需求,就完全不必实现ISerializable。...要实现ISerializable但基类没有实现怎么办? ISerializable接口功能非常强大,运行类型可以完全控制如何对类型的实例进行序列化和反发序列化。...现在,当派生类实现ISerializable接口的时候,还要负责它的基类的字段的序列化,如果基类已经实现了ISerializable接口,那么对基类的字段进行序列化就非常简单,调用基类的GetObjectData...但是当基类没有实现ISerializable接口的时候,派生类必须手动序列化基类的字段,具体的做法是获取它们的值,并把这些值添加到SerializationInfo对象里。

    50420

    C#中Serializable序列化实例

    例如,假设某个类用一个成员变量来存储线程 ID。当此类被反序列化时,序列化此类时所存储的 ID 对应的线程可能不再运行,所以对这个值进行序列化没有意义。...要实现 ISerializable,需要实现 GetObjectData 方法以及一个特殊的构造函数,在反序列化对象时要用到此构造函数。...以下代码示例说明了如何在前一部分中提到的 MyObject 类上实现 ISerializable。...需要强调的是,将 ISerializable 添加至某个类时,需要同时实现 GetObjectData 以及特殊的构造函数。如果缺少 GetObjectData,编译器将发出警告。...但是,由于无法强制实现构造函数,所以,缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类,将会出现异常。

    1.8K30

    dotnet remoting 抛出异常

    本文告诉大家如何在使用 .net remoting 的时候,抛出异常。 所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefObject 或其他可以序列化的类。...如果需要在 .net remoting 使用异常,那么需要自己创建一个异常,继承 RemotingException 反序列 因为默认的 RemotingException 没有反序列,所以需要添加 Serializable...是不是觉得很复杂,实际上简单的方法是通过 json 在GetObjectData把类转换为json,在构造转换为类。...ISerializable 那么为什么在使用 Serializable 特性还需要继承 ISerializable ,因为继承 ISerializable 就可以在一个构造函数xx([NotNull]...- Stack Overflow How to: Create an Exception Type That Can be Thrown by Remote Objects 我的博客即将搬运同步至腾讯云

    1K20

    .net remoting 抛出异常

    本文告诉大家如何在使用 .net remoting 的时候,抛出异常。 所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefObject 或其他可以序列化的类。...如果需要在 .net remoting 使用异常,那么需要自己创建一个异常,继承 RemotingException 反序列 因为默认的 RemotingException 没有反序列,所以需要添加 Serializable...(string str) : base(str) { } } 微软建议继承ISerializable,标记特性 [Serializable] public...是不是觉得很复杂,实际上简单的方法是通过 json 在GetObjectData把类转换为json,在构造转换为类。...ISerializable 那么为什么在使用 Serializable 特性还需要继承 ISerializable ,因为继承 ISerializable 就可以在一个构造函数xx([NotNull]

    1.4K10

    dotnet remoting 抛出异常

    本文告诉大家如何在使用 .net remoting 的时候,抛出异常。 所有在远程软件运行的类,如果需要传输到本地,都需要继承 MarshalByRefObject 或其他可以序列化的类。...如果需要在 .net remoting 使用异常,那么需要自己创建一个异常,继承 RemotingException 反序列 因为默认的 RemotingException 没有反序列,所以需要添加 Serializable...是不是觉得很复杂,实际上简单的方法是通过 json 在GetObjectData把类转换为json,在构造转换为类。...ISerializable 那么为什么在使用 Serializable 特性还需要继承 ISerializable ,因为继承 ISerializable 就可以在一个构造函数xx([NotNull]...我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?

    1.4K10

    一个关于反序列化的小问题

    大家都知道,我们具有三种定义可序列化类型的方式:在类型上应用SerializableAttribute特性;应用DataContractAttribute/DataMemberAttribute特性和实现...当你通过继承一个现有的类来定义你需要被序列化的类,如果这个父类实现了ISerializable接口,如果定义不当,就会出现反序列化的问题。而且这个我们可能经常都不注意。...3: { 4: } 然后我通过下面的代码对MyDictionary对象进行序列化和反序列化,我直接采用的序列化器为BinaryFormatter。...实际上,这里并不是找不到默认(无参)构造函数,而是找不到一个具有特殊参数列表的构造函数。该构造函数接收两个参数,类型分别是:SerializationInfo和StreamingContext。...,你就会得到想要的输出结果: 1: 001: Foo 2: 002: Bar 3: 003: Baz 如果一个类型实现了ISerializable接口(Dictionary<TKey,

    703100

    如何正确实现一个自定义 Exception

    自定义异常 编写一个自定义的异常,继承自 Exception,其中定义一个 ErrorCode 来存储异常编号。平平无奇的一个类,太常见了。大家觉得有没有什么问题?...ErrorCode = info.GetString("ErrorCode"); } 这个 GetObjectData 方法是 ISerializable 接口提供的方法,所以基类里肯定有实现...总结 自定义异常是大家日常编码过程中非常常见的操作。但是看来要写好一个自定义异常类也不是那么简单。...在序列化构造器对字段值进行恢复,不要忘记调用基类的序列化构造器 重写 GetObjectData 方法,把需要序列化的字段添加到 SerializationInfo 对象上,同样不要忘记调用基类的...GetObjectData 这个问题虽然在自定义 Exception 上暴露出来,其实可以推广到所有实现 ISerializable 接口的类都需要注意 3,4 两点。

    16620

    C#规范整理·资源管理和序列化

    受保护的虚方法用来提醒子类:必须在实现自己的清理方法时注意到父类的清理工作,即子类需要在自己的释放方法中调用base.Dispose方法。...微软官方的解释是,当满足以下条件之一时将发生垃圾回收: 系统具有低的物理内存。 由托管堆上已分配的对象使用的内存超出了可接受的范围。 调用GC.Collect方法。...接口更灵活地控制序列化过程# 除了利用特性Serializable之外,我们还可以注意到在序列化的应用中,常常会出现一个接口ISerializable。...、OnSerializingAttribute、NonSerialized等特性不能完全满足自定义序列化的要求,那就需要继承ISerializable了。...4.实现ISerializable的子类型应负责父类的序列化# 我们将要实现的继承自ISerializable的类型Employee有一个父类Person,假设Person没有实现序列化,而现在子类Employee

    27120

    .NET简谈组件程序设计之(渗入序列化过程)

    在对象的内部所有的成员如果没有被禁止序列化,那么都会经过序列化工程,所以我们很难保证在特殊的对象上能否递归遍历序列化成功。...方法,系统在反序列化的时候会检查待序列化对象是否实现了IDeserializationCallback接口,如果实现了,那么系统就调用该接口中的OnDeserialization方法。...Event事件,如果我没有在MyClass类中的Event事件上加上禁止序列化特性,那么执行序列化的时候肯定是回报错的。...那么我们就来实现ISerializable接口,通过这个接口我们基本上能控制序列化和反序列化的所有数据。...ISerializable接口,里面只有一个方法GetObjectData,这个方法我想是系统要调用的,是用来获取序列化数据对的,我们通过Serializationinfo对象来进行设置。

    31830

    【深入浅出C#】章节 7: 文件和输入输出操作:序列化和反序列化

    在上述示例中,我在代码中加入了 [Serializable] 特性来标记 Person 类,以便让它可以被二进制和XML序列化。...以下是使用 OptionalFieldAttribute 进行版本控制的基本步骤: 标记新增字段: 在对象的新版本中,如果添加了新的字段,可以在这些字段上添加 OptionalField 特性。...这将告诉序列化引擎,在反序列化旧版本数据时,这些字段是可选的,如果数据中没有这些字段,就使用默认值。...IFormatter 接口,你可以完全掌控序列化和反序列化的过程,从而实现自定义的序列化格式。...自定义序列化: 对于复杂的对象,可能需要自定义序列化和反序列化过程。这可以通过实现 ISerializable 接口来实现,以便完全控制序列化和反序列化的过程。

    94880

    Dotnet反序列化——XmlSerializer链

    ISerializable 我们先来看看实现ISerializable 接口的类 序列化、反序列化调用流程 using System; using System.Runtime.Serialization...同时我们在上面的代码中可以看到在实例化XmlSerializer 时,在传入的参数中我们用到了Type.GetType方法去获取需要被序列化/反序列化的类的type。...攻击链 ObjectDataProvider 要打造围绕XmlSerializer 的攻击链,我们需要先了解一下ObjectDataProvider这个类,这个类可以帮助我们进行命令执行等操作。...这个类位于System.Windows.Data下(如果rider提示找不到包,就添加PresentationFramework依赖,注意我当前的环境是.NET FrameWork)。...本质上是一个泛型类,可以封装非特定数据类型的对象。

    51820

    .NET简谈组件程序设计之(初识序列化、持久化)

    文章的标题提到了“持久化”的名词,那么持久化又是什么呢? 解释:持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。...public SerializableAttribute(); } } 这是Serializable特性的定义,通过使用Serializable特性进行标记类、结构、枚举、委托。...那么就可以使用格式化器进行序列化了,没有被Serializable特性标记的对象无法进行序列化,在序列化的时候会抛出异常。...上图中的两个Iformatter接口实现类(Binarymatter、SoapMatter)都已经帮我们实现了复杂的二进制序列化和Soap序列化,我们只需要通过简单的使用它们就行了。...在序列化的对象的时候,系统是递归的序列化对象内部的每一个成员,如果有一个对象是不允许序列化的,也就是没有加上Serializable特性的。那么在序列化的时候就会失败。

    37130

    如何将类序列化并直接存储入数据库

    系列化这项技术可以应用在将程序产生的结果数据存储到文件系统中,但是它更主要的应用是在于.Net Remoting和Web服务的实现上。...二、序列化机制对类的要求   如果你要对一个对象进行序列化,那么你必须将它的类型标记为[Serializable()],该操作是通过SerializableAttribute属性来实现的。...如果你要获得对序列化的更大的控制权,那么你就得使用“自定义序列化“的方式。通过使用这种方式,你可以完全的控制类的哪些部分能被序列化而哪些部分不能,同时你还可以控制如何具体的进行序列化。...首先,程序的类必须实现System.Runtime.Serialization.ISerializable接口,该接口的功能就是允许对象控制其自己的序列化和反序列化过程。...,读者可能不能理会到系列化带来的强大功能,所以下面我就给这个方法添加一些东西。

    2.3K10

    谈谈分布式事务之三: System.Transactions事务详解

    具有最高隔离级别,代表的是一种完全基于序列化(同步)的数据存取方式,这也是System.Transactions事务默认采用的隔离级别。...按照隔离级别至高向低,7个不同的隔离级别代表的含义如下: Serializable:可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据; RepeatableRead:可以在事务期间读取可变数据...一个完整的转帐操作本质上有两个子操作完成,提取和存储,即从一个帐户中提取相应的金额存入另一个帐户。为了完成这两个操作,我写了如下两个存储过程:P_WITHDRAW和P_DEPOSIT。...[T_ACCOUNT] WHERE Id = @id 11: GO 为了执行存储过程的方便,我写了一个简单的工具类DbAccessUtil。...下面是没有采用事务机制的转帐实现(注意:需要转入的帐户不存在)。

    1.4K90

    框架设计原则和规范(四)

    修饰属性 Attribute 1) 要在命名自定义修饰属性类时添加“Attribute”后缀。...如LinkedList, Stack d) 避免在为集合抽象命名时添加代表其具体实现的后缀,比如“LinkedList”或“Hashtable” e) 考虑用集合元素的类型名字做集合名字的前缀...如果想要完全控制序列化整个过程,考虑实现运行时序列化模式 C....相等性操作符 1) 不要只重载相等性操作符中的一个 2) 要确保Object.Equals与相等性操作符具有完全相同的语义及相近的性能 3) 避免抛出异常 4) 值类型的相等性操作符 A.要重载值类型的相等性操作符...避免重载引用类型的相等性操作符——如果其实现会比引用相等性的实现慢得多 感谢大家的阅读,如觉得此文对你有那么一丁点的作用,麻烦动动手指转发或分享至朋友圈。如有不同意见,欢迎后台留言探讨。

    1.5K40

    C#三十一 序列化与反序列化

    可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、2可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。...,只需要序列Clone方法和一些属性,私有的方法无需要,还例如在读取大规模的IO的时候,读取操作完全不需要......这时候就需要自己集成重写序列的ISerializable接口: 实现该接口需要两个注意的,一个就是构造函数,主要是为了反序列,另一个就是GetObjectData,主要是执行序列化,例如我们现在有一个Employee...Employee NoSerialString: NoSerialString-Test 看到Employee NoSerialString:属性的值没有,它保持默认值,没有序列化。 ​...8.2 Xml格式序列化及反序列化​ 要序列化的对象的类:   [Serializable]   public class Person   {   private string name;   public

    11010
    领券