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


    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)

  • 相关阅读:
    boxcox1p归一化+pipeline+StackingCVRegressor
    rt-thread调度锁与关闭中断深度探究
    树莓派4最小化安装Linux
    树莓派4可以不用SD卡启动
    树莓派JTAG详细使用笔记
    树莓派上玩街机游戏
    用树莓派制作红白游戏机
    树莓派4上使用uboot+tftp调试rt-thread程序
    在window上搭建树莓派4b的RT-Thread开发环境2
    树莓派上运行RT-Thread并通过esp8266连接网络
  • 原文地址:https://www.cnblogs.com/sift/p/3597465.html
Copyright © 2020-2023  润新知