ISerializable接口-控制序列化与反序列化(回答C#不需要实现此接口也可以序列化,那么实现该接口的意义是什么?)

https://www.cnblogs.com/fanfan-90/p/12038928.html

(回答C#不需要实现此接口也可以序列化,那么实现该接口的意义是什么?)

 

 

ISerializable接口-控制序列化与反序列化

继承ISerializable接口可以灵活控制序列化过程

格式化器的工作流程:格式化器再序列化一个对象的时候,发现对象继承了ISerializable接口,那它就会忽略掉类型所有的序列化特性,转而调用类型的GetObjectData方法来构造一个SerializationInfo对象。

我们在方法GetObjectData中处理序列化,然后在一个带参数的构造方法中处理反序列化。虽然在接口中没有地方指出需要这样一个构造器,但这确实是需要的,除非我们序列化后不再打算把它反序列化回来。

注意:类上必须添加[Serializable]标签

 public interface ISerializable
     {
         [SecurityCritical]
         void GetObjectData(SerializationInfo info, StreamingContext context);
     }

 

[Serializable]
    public class UserInfo : ISerializable
    {
        //public string FirstName { get; set; }
        //public string LastName { get; set; }
        public string Name { get; set; }
        public UserInfo() { }
        public UserInfo(SerializationInfo info, StreamingContext context) {
            Name = info.GetString("Name");
            //FirstName = info.GetString("FirstName");
            //LastName = info.GetString("LastName");
        }
        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Name", this.Name);
            if (!string.IsNullOrWhiteSpace(this.Name))
            {
                info.AddValue("FirstName", this.Name.Split(' ')[0]);
                info.AddValue("LastName", this.Name.Split(' ')[1]);
            }

        }
    }

    public class UserInfoDTO
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Name { get; set; }
    }

 

 

        static void Main(string[] args)
        {
            UserInfo userInfo = new UserInfo { Name= "尼古拉斯 赵四" };

            string seriaData = JsonConvert.SerializeObject(userInfo);//{"Name":"尼古拉斯 赵四","FirstName":"尼古拉斯","LastName":"赵四"}
            UserInfoDTO userInfoDTO = JsonConvert.DeserializeObject<UserInfoDTO>(seriaData);
            Console.ReadKey();
        }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值