zoukankan      html  css  js  c++  java
  • .NET面试基础知识之序列化(Serialize)(三)

    Serializing a Type as a different type and deserializing an object as a different object

    下面的代码是序列化一个Singleton类并反序列化

      [Serializable]
        public sealed class SingletonSerializable:ISerializable
        {
            private SingletonSerializable()
            {
            }

            private static readonly SingletonSerializable theOneObject=new SingletonSerializable();

            public string Name="Jeff";
            public DateTime Date = DateTime.Now;

            public static SingletonSerializable GetSingleton()
            {
                return theOneObject;
            }

            [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
            void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.SetType(typeof(SingletonSerializationHelper));

           //Tell the formatter to serialize the SingletonSerializable object as a SingletonSerializableHelper object instead.

          //The formatter automatically detected that both array elements refer to a single object, the formatter serialize only one object.

          //So the formatter no need the special constructor
            }

            [Serializable]

         //When a type implements IObjectReference, the formatter calls the GetRealObject method
            private sealed class SingletonSerializationHelper:IObjectReference
            {
                public Object GetRealObject(StreamingContext context)
                {
                    return SingletonSerializable.GetSingleton();

              //Return a reference to the object that you really want a reference to now that deserialization of the object has completed.
                }
            }
        }

    test

      public static void TestSingleton()
        {
            SingletonSerializable[] al = { SingletonSerializable.GetSingleton(),SingletonSerializable.GetSingleton()};
            Console.WriteLine("Do both elements refer to the same object?"+(al[0]==al[1]));//True

            using (Stream st = new MemoryStream()) {
               BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(st,al);
                st.Position = 0;
                SingletonSerializable[] a2 =(SingletonSerializable[]) formatter.Deserialize(st);
                Console.WriteLine("Do both elements refer to the same object?"+(a2[0]==a2[1]));//True
                Console.WriteLine("Do both elements refer to the same object?"+(al[0]==a2[0]));//True
            }
        }

  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/sift/p/3597376.html
Copyright © 2011-2022 走看看