Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Runtime.Serialization;
- using System.Runtime.Serialization.Formatters.Binary;
- namespace BinaryFormatterBug
- {
- class NonSerializableClass
- {
- public DateTime dateTime = DateTime.MinValue;
- public NonSerializableClass(){}
- public override string ToString()
- {
- return dateTime.ToString();
- }
- public void FromString(string str)
- {
- DateTime.TryParse(str, out dateTime);
- }
- #region Overrides
- public override int GetHashCode()
- {
- return dateTime.GetHashCode();
- }
- public override bool Equals(object obj)
- {
- if( obj == null )
- return false;
- if( obj as NonSerializableClass == null )
- return base.Equals(obj);
- return this.dateTime == (obj as NonSerializableClass).dateTime;
- }
- public static bool operator ==(NonSerializableClass a, NonSerializableClass b)
- {
- if( Object.ReferenceEquals(a, b) )
- return true;
- if( (object)a == null || (object)b == null )
- return false;
- return a.Equals(b);
- }
- public static bool operator !=(NonSerializableClass a, NonSerializableClass b)
- {
- return !(a == b);
- }
- #endregion
- }
- [Serializable]
- class SerializableWrapperClass
- {
- [NonSerialized]
- public NonSerializableClass NSC = new NonSerializableClass();
- private string nscBackup = null;
- public SerializableWrapperClass(){}
- [OnSerializing]
- private void OnSerializing(StreamingContext context)
- {
- //backup the nonserializable object as a string
- this.nscBackup = NSC.ToString();
- Debug.WriteLine("--Serialized");
- }
- [OnDeserialized]
- private void OnDeserialized(StreamingContext context)
- {
- //attempt to restore the nonserializable object from the string backup
- NSC = new NonSerializableClass();
- NSC.FromString(nscBackup);
- Debug.WriteLine("--Deserialized");
- }
- #region Overrides
- public override int GetHashCode()
- {
- return NSC.GetHashCode();
- }
- public override bool Equals(object obj)
- {
- if( obj == null )
- return false;
- if( obj as SerializableWrapperClass == null )
- return base.Equals(obj);
- return this.NSC == (obj as SerializableWrapperClass).NSC;
- }
- public static bool operator ==(SerializableWrapperClass a, SerializableWrapperClass b)
- {
- if( Object.ReferenceEquals(a, b) )
- return true;
- if( (object)a == null || (object)b == null )
- return false;
- return a.Equals(b);
- }
- public static bool operator !=(SerializableWrapperClass a, SerializableWrapperClass b)
- {
- return !(a == b);
- }
- #endregion
- }
- class Program
- {
- static void Main(string[] args)
- {
- //create 10 identical objects and stick them in the list
- var list = new List<SerializableWrapperClass>();
- for(int i=0; i < 10; i++)
- {
- list.Add( new SerializableWrapperClass() );
- list[i].NSC.dateTime = DateTime.Today;
- }
- //clone the list with BinaryFormatter
- List<SerializableWrapperClass> clonedList = null;
- using( var ms = new MemoryStream() )
- {
- var formatter = new BinaryFormatter();
- formatter.Serialize(ms, list);
- ms.Seek(0, SeekOrigin.Begin);
- clonedList = (List<SerializableWrapperClass>)formatter.Deserialize(ms);
- }
- //compare the lists
- //the first object will have serialized correctly, the rest will have been skipped
- for(int i=0; i < 10; i++)
- {
- if( list[i] == clonedList[i] )
- Console.WriteLine(i + " Clone succeeded!");
- else
- Console.WriteLine(i + " Clone failed!");
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement