public override bool Equals(Object obj) { if(obj == this) { return true; } if(obj == null || !(obj is MyChildObject)) { return false; } MyChildObject realObj = (MyChildObject)obj; if(!(MyChildField.Equals(realObj.MyChildField))) { return false; } return true; } public override bool Equals(Object obj) { if(obj == this) { return true; } if(obj == null || !(obj is MyObject)) { return false; } MyObject realObj = (MyObject)obj; if(!(MyField.Equals(realObj.MyField))) { return false; } if(!(MyObjectField.Equals(realObj.MyObjectField))) { return false; } if(!(MyListField.SequenceEqual(realObj.MyListField))) { return false; } if(!(MyEnumField.Equals(realObj.MyEnumField))) { return false; } if(!(MyDateTimeField.Equals(realObj.MyDateTimeField))) { return false; } return true; } public override int GetHashCode() { return MyChildField.GetHashCode(); } public override int GetHashCode() { return MyField.GetHashCode() ^ MyObjectField.GetHashCode() ^ MyListField.GetHashCode() ^ MyEnumField.GetHashCode() ^ MyDateTimeField.GetHashCode(); } public void Serialize(MyChildObject obj, BinaryWriter writer) { writer.Write(obj.MyChildField); } public void Serialize(MyObject obj, BinaryWriter writer) { writer.Write(obj.MyField); Serialize(obj.MyObjectField, writer); writer.Write(obj.MyListField.Count); foreach(long listObj in obj.MyListField) { writer.Write(listObj); } writer.Write((int)obj.MyEnumField); writer.Write(obj.MyDateTimeField.Ticks); } public void Deserialize(MyChildObject obj, BinaryReader reader) { obj.MyChildField = reader.ReadString(); } public void Deserialize(MyObject obj, BinaryReader reader) { obj.MyField = reader.ReadInt32(); Deserialize(obj.MyObjectField, reader); int countOfMyListField = reader.ReadInt32(); for(int i = 0; i < countOfMyListField; ++i) { long listObj; listObj = reader.ReadInt64(); obj.MyListField.Add(listObj); } obj.MyEnumField = (MyEnum)reader.ReadInt32(); obj.MyDateTimeField = new DateTime(reader.ReadInt64()); }