Good points I should have mentionned in my post. That said, using
serialisation seems to fit the 80/20 rule. I would really not like to
maintain custom cloning/serialisation code for all objects ....

Btw, point 1 would not be an issue if BinaryFormatter was not so slow
in the first place ...This has been a known issue for a long time. I
hope it gets fixed one day, the sooner the better.

Sébastien

On 10/31/07, Fabian Schmied <[EMAIL PROTECTED]> wrote:
> > If you use binary serialization to clone, you're halfway to copy/paste, if 
> > that's a
> > goal. If a class is properly clonable, it ought to be 
> > serializable/deserializable, it
> > seems to me. Then you can kill two birds with one stone: implement 
> > Iclonable in
> > terms of binary serialization. If a class derives from MarshalByRefObject, 
> > it
> > probably shouldn't be clonable, but I don't want to be dogmatic about it.
>
> There are two important drawbacks about cloning by serialization that
> one should be aware of:
>
> 1- Performance: Using BinaryFormatter is much slower than a manual
> implementation of Clone, and it's probably also much slower than a
> reflection-based implementation. Of course, as "slow" is relative,
> that's only an issue if you need to do a lot of cloning within tight
> time constraints.
>
> 2- Semantics: A well-behaved implementation of Clone would be expected
> to recursively call Clone on any ICloneable objects it contains. This
> does not happen when you do binary serialization, which can be an
> issue.
>
> Regarding the original question (in case you don't want to use
> serialization): You can use Reflection to check whether an object has
> been cloned correctly, as others have suggested, but as you've
> noticed, this only moves the problem to the issue of setting all
> fields of an object prior to testing.
>
> However, this is something you can ensure in your test: if you have a
> reflection-based comparer, you can not only test whether the object
> has been cloned correctly, but also that the source object is not
> equal to a "default" one.
>
> Illustrative code:
>
> [Test]
> public void Clone()
> {
>   MyClass source = GetCloneTestSource();
>   MyClass defaultObject = new MyClass();
>   Assert.IsFalse (ReflectionBasedComparer.AreEqual (source,
>     defaultObject), "Forgot to initialize field for cloning.");
>   MyClass clone = source.Clone();
>   Assert.IsTrue (ReflectionBasedComparer.AreEqual (source, clone),
>     "Clone failed");
> }
>
> Fabian
>
> ===================================
> This list is hosted by DevelopMentor(R)  http://www.develop.com
>
> View archives and manage your subscription(s) at http://discuss.develop.com
>


-- 
Sébastien
www.sebastienlorion.com

===================================
This list is hosted by DevelopMentor®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to