继承ISerializable接口可以灵活控制序列化过程
格式化器的工作流程:格式化器再序列化一个对象的时候,发现对象继承了ISerializable接口,那它就会忽略掉类型所有的序列化特性,转而调用类型的GetObjectData方法来构造一个SerializationInfo对象。
我们在方法GetObjectData中处理序列化,然后在一个带参数的构造方法中处理反序列化。虽然在接口中没有地方指出需要这样一个构造器,但这确实是需要的,除非我们序列化后不再打算把它反序列化回来。
1 public interface ISerializable 2 { 3 [SecurityCritical] 4 void GetObjectData(SerializationInfo info, StreamingContext context); 5 }
[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(); }