【C#】详解C#序列化

目录结构:

contents structure [+]

 

 

在这边文章中,笔者将会将会详细阐述C#中的序列化和反序列,希望可以对你有所帮助。

1.简介

众所周知,序列化是将对象或对象图转化字节流的过程,反序列化是将字节流转化为对象图的过程。
如果要使一个类型可序列化的话,必需向类型应用定制特性System.SerializableAttribute。请注意,SerializableAttribute特性只能应用于引用类型(class)、值类型(struct)、枚举类型(enum)和委托类型(delegate)。枚举和委托类型总是可序列化的所以不必显示使用SerializableAttribute特性。

序列化必须要使用到序列化器,它用于完成将数据转化为特定格式的数据。以下列举四种格式化器:
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 以二进制的格式对对象进行序列化和反序列操作。

System.Runtime.Serialization.Formatters.Soap.SoapFormatter 以SOAP的格式对对象进行序列化和反序列化操作,从.NET Framework2.0开始,该类就废弃,推荐使用BinaryFormatter类。

System.Runtime.Serialization.NetDataContractSerializer 用.NET Framework提供的类型,将类型实例序列化和返序列化为XML流或文档结构。

System.Runtime.Serialization.DataContractSerializer 使用指定的数据协定,将类型实例序列化和反序列化XML流或文档结构

System.Xml.Serialization.XmlSerializer 将类型的实例序列化和反序列化XML文档,该类允许控制如何将对象编码为XML文档。

2.控制序列化和反序列化

如果将SerializableAttribute特性应用于某个类型,那么标志该类型的实例可以进行序列化和反序列化操作,该类型实例的所有数据都可以进行序列化和反序列化操作,如果需要更精准的控制序列化和反序列化的数据,那么就需要控制序列化和反序列化的过程了。

这里笔者把序列化和反序列化的操作方式分为两种,分别为通过特性和通过接口的方式。

2.1 特性(OnSerializing、OnSerialized、OnDeserializing、OnDeserialized、NonSerialized...)

在这里笔者将会介绍序列化中常用的特性,用这些特性可以控制序列化的过程。

System.Runtime.Serialization.OnSerializingAttribute:
应用OnSerializingAttribute特性的方法,将会在序列化期间被调用。同时,应用OnSerializingAttribute特性的方法必须包含一个System.Runtime.Serialization.StreamingContext参数。

System.Runtime.Serialization.OnSerializedAttribute:
应用OnSerializedAttribute特性的方法,将会在序列化之后被调用。同时,应用OnSerializedAttribute特性的方法必须包含一个System.Runtime.Serialization.StreamingContext参数。

System.Runtime.Serialization.OnDeserializingAttribute:
应用OnDeserializingAttribute特性的方法,将会在被序列化期间被调用。同时,应用OnDeserializingAttribute特性的方法必须包含一个System.Runtime.Serialization.StreamingContext参数。

System.Runtime.Serialization.OnDeserializedAttribute:
应用OnDeserializedAttribute特性的方法,将会在被序列化之后调用。同时,应用OnDeserializedAttribute特性的方法必须包含一个System.Runtime.Serialization.StreamingContext参数。

System.NonSerializedAttribute:
应用NonSerializedAttribute特性的字段,将会不会序列化。可以利用这个特性保护保护敏感数据,NonSerializedAttribute不仅可以引用字段,还以应用于event。

 

例如:

[field:NonSerializedAttribute()]
public event ChangedEventHandler Changed;

下面给上面使用上面特性的类:

//标记为可序列化
    [Serializable]
    class MyType {
        Int32 x, y;
        //标记num为不可序列
        [NonSerialized]
        Int32 num;

        public MyType(Int32 x, Int32 y) {
            this.x = x;
            this.y = y;
            this.num=(x+y);
        }

        //标记该方法在序列化期间被调用
        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            //举例:在序列化前,修改任何需要修改的状态
        }

        //标记该方法在序列化之后被调用
        [OnSerialized]
        private void OnSerialized(StreamingContext context) {
            //
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我了解到你想了解关于C#中的序列化和反序列化的知识。在这方面,引用和引用提供了一些代码示例和解释。C#中的序列化和反序列化是将对象转换为可传输或存储的格式,以及将该格式转换回对象的过程。 四层指的是什么我不太确定,但我可以解释一下C#中的序列化和反序列化的常见用途。首先,序列化常用于将对象转换为字符串或二进制格式,以便在网络上进行传输或存储到文件中。这在分布式系统中非常有用,因为它允许不同的系统或应用程序之间传递和共享数据。 在C#中,可以使用不同的方式进行序列化和反序列化,比如二进制序列化、XML序列化和JSON序列化。引用中的示例展示了如何使用BinaryFormatter对一个Person对象进行二进制序列化和反序列化。引用中的示例展示了如何使用JsonConvert对JSON格式的数据进行反序列化。这些示例都需要适当的命名空间和类型。 总的来说,C#中的序列化和反序列化是一种非常有用的机制,可以在不同的系统或应用程序之间传递和共享数据。使用适合你的需求的序列化方法,并根据需要进行相应的反序列化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#序列化与反序列化详解](https://blog.csdn.net/sD7O95O/article/details/117267369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C#_Json反序列化](https://blog.csdn.net/weixin_43986048/article/details/126868364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [详解C#序列化与反序列化](https://blog.csdn.net/weixin_67336587/article/details/125633695)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值