ISerializable接口

时间:2023-03-09 18:34:27
ISerializable接口

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

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

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

 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(' ')[]);
info.AddValue("LastName", this.Name.Split(' ')[]);
} }
} 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();
}

参考:https://www.cnblogs.com/farmer-y/p/7991961.html