.NET面试基础知识之序列化(Serialize)(四)

本文介绍了一个具体的序列化代理类UniversalToLocalTimeSerializationSurrogate,该类实现了ISerializationSurrogate接口,用于将DateTime对象从本地时间转换为世界标准时间再进行序列化,并在反序列化时还原为本地时间。

Serialization Surrogate

一个对象去系列化另一个对象

Code:

  public sealed class UniversalToLocalTimeSerializationSurrogate:ISerializationSurrogate
    {
        public UniversalToLocalTimeSerializationSurrogate()
        {
        }

        public void GetObjectData(object obj,SerializationInfo info,StreamingContext context)
        {
            info.AddValue("Date",((DateTime)obj).ToUniversalTime().ToString("u"));
        }

        public object SetObjectData(object obj, SerializationInfo info, StreamingContext context,ISurrogateSelector selector)
        {
            return DateTime.ParseExact(info.GetString("Date"),"u",null).ToLocalTime();
        }
    }

实现ISerializationSurrogate接口

使用

    public static void TestSurrogate()
        {
            using (var st = new MemoryStream()) {
                IFormatter formatter = new SoapFormatter();
                SurrogateSelector ss = new SurrogateSelector();
                ss.AddSurrogate(typeof(DateTime),formatter.Context,
                    new UniversalToLocalTimeSerializationSurrogate());
                formatter.SurrogateSelector = ss;
                DateTime localTimeBeforeSerialize = DateTime.Now;
                formatter.Serialize(st, localTimeBeforeSerialize);

                st.Position = 0;
                Console.WriteLine(new StreamReader(st));

                st.Position = 0;
                DateTime localTimeAfterSerialize = (DateTime)formatter.Deserialize(st);

                Console.WriteLine("LocalTimeBeforeSerialize={0}",localTimeBeforeSerialize);
                Console.WriteLine("LocalTimeAfterSerialize={0}",localTimeAfterSerialize);
            }
        }

Surrogate selector可以是一个集合

实现接口ISurrogateSelector,有三个方法

void ChainSelector(ISurrogateSelector selector)

ISurrogateSelector GetNextSelector()

ISerializationSurrogate GetSurrogate(Type type, StreamContext context, out ISurrogateSelector selector)

转载于:https://www.cnblogs.com/sift/p/3597465.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值