Advertisement
Guest User

Test case for BinaryFormatter bug

a guest
Jul 12th, 2012
526
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.56 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Runtime.Serialization;
  6. using System.Runtime.Serialization.Formatters.Binary;
  7.  
  8. namespace BinaryFormatterBug
  9. {
  10.     class NonSerializableClass
  11.     {
  12.         public DateTime dateTime = DateTime.MinValue;
  13.  
  14.         public NonSerializableClass(){}
  15.  
  16.         public override string ToString()
  17.         {
  18.             return dateTime.ToString();
  19.         }
  20.  
  21.         public void FromString(string str)
  22.         {
  23.             DateTime.TryParse(str, out dateTime);
  24.         }
  25.  
  26.         #region Overrides
  27.         public override int GetHashCode()
  28.         {
  29.             return dateTime.GetHashCode();
  30.         }
  31.  
  32.         public override bool Equals(object obj)
  33.         {
  34.             if( obj == null )
  35.                 return false;
  36.  
  37.             if( obj as NonSerializableClass == null )
  38.                 return base.Equals(obj);
  39.  
  40.             return this.dateTime == (obj as NonSerializableClass).dateTime;
  41.         }
  42.  
  43.         public static bool operator ==(NonSerializableClass a, NonSerializableClass b)
  44.         {
  45.             if( Object.ReferenceEquals(a, b) )
  46.                 return true;
  47.  
  48.             if( (object)a == null || (object)b == null )
  49.                 return false;
  50.  
  51.             return a.Equals(b);
  52.         }
  53.  
  54.         public static bool operator !=(NonSerializableClass a, NonSerializableClass b)
  55.         {
  56.             return !(a == b);
  57.         }
  58.         #endregion
  59.     }
  60.  
  61.     [Serializable]
  62.     class SerializableWrapperClass
  63.     {
  64.         [NonSerialized]
  65.         public NonSerializableClass NSC = new NonSerializableClass();
  66.         private string nscBackup = null;
  67.  
  68.         public SerializableWrapperClass(){}
  69.  
  70.         [OnSerializing]
  71.         private void OnSerializing(StreamingContext context)
  72.         {
  73.             //backup the nonserializable object as a string
  74.             this.nscBackup = NSC.ToString();
  75.             Debug.WriteLine("--Serialized");
  76.         }
  77.  
  78.         [OnDeserialized]
  79.         private void OnDeserialized(StreamingContext context)
  80.         {
  81.             //attempt to restore the nonserializable object from the string backup
  82.             NSC = new NonSerializableClass();
  83.             NSC.FromString(nscBackup);
  84.  
  85.             Debug.WriteLine("--Deserialized");
  86.         }
  87.  
  88.         #region Overrides
  89.         public override int GetHashCode()
  90.         {
  91.             return NSC.GetHashCode();
  92.         }
  93.  
  94.         public override bool Equals(object obj)
  95.         {
  96.             if( obj == null )
  97.                 return false;
  98.  
  99.             if( obj as SerializableWrapperClass == null )
  100.                 return base.Equals(obj);
  101.  
  102.             return this.NSC == (obj as SerializableWrapperClass).NSC;
  103.         }
  104.  
  105.         public static bool operator ==(SerializableWrapperClass a, SerializableWrapperClass b)
  106.         {
  107.             if( Object.ReferenceEquals(a, b) )
  108.                 return true;
  109.  
  110.             if( (object)a == null || (object)b == null )
  111.                 return false;
  112.  
  113.             return a.Equals(b);
  114.         }
  115.  
  116.         public static bool operator !=(SerializableWrapperClass a, SerializableWrapperClass b)
  117.         {
  118.             return !(a == b);
  119.         }
  120.         #endregion
  121.     }
  122.  
  123.     class Program
  124.     {
  125.         static void Main(string[] args)
  126.         {
  127.             //create 10 identical objects and stick them in the list
  128.             var list = new List<SerializableWrapperClass>();
  129.             for(int i=0; i < 10; i++)
  130.             {
  131.                 list.Add( new SerializableWrapperClass() );
  132.                 list[i].NSC.dateTime = DateTime.Today;
  133.             }
  134.  
  135.             //clone the list with BinaryFormatter
  136.             List<SerializableWrapperClass> clonedList = null;
  137.             using( var ms = new MemoryStream() )
  138.             {
  139.                 var formatter = new BinaryFormatter();
  140.                 formatter.Serialize(ms, list);
  141.                 ms.Seek(0, SeekOrigin.Begin);
  142.                 clonedList = (List<SerializableWrapperClass>)formatter.Deserialize(ms);
  143.             }
  144.  
  145.             //compare the lists
  146.             //the first object will have serialized correctly, the rest will have been skipped
  147.             for(int i=0; i < 10; i++)
  148.             {
  149.                 if( list[i] == clonedList[i] )
  150.                     Console.WriteLine(i + " Clone succeeded!");
  151.                 else
  152.                     Console.WriteLine(i + " Clone failed!");
  153.             }
  154.         }
  155.     }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement