citronas
citronas

Reputation: 19365

Is there a way to determine in the constructor of a class if an instance is being deserialized?

Lets say I have business class:

public class Foo
{
   public int Prop1 {get;set;}
   public int Prop2 {get;set;}

   public Foo(int prop1, int prop2)
   {
      this.Prop1 = prop1;
      this.Prop2 = prop2;
   }

   public Foo()
   {
     throw new NotImplementedException();
   }
}

The business class is only valid if both properties are set. Therefore I could ensure implementing the parameterless constructor and throw a NotImplementedException if someone tries to instanciate the class with the parameterless constructor.

But now I want to be able to serialize/deserialize my class. For the deserilization process I need the default constructor, which musn't throw the NotImplementedExeption anymore.

Is there a way to find out whether a create an instance of my class with the default constructor or whether the object is being deserialized?

Let's assume I have no valid default values for both properties.

How could I solve this situation?

Upvotes: 1

Views: 117

Answers (3)

Jon Hanna
Jon Hanna

Reputation: 113322

If you implement ISerializable then you will have the deserialisation happen through the constructor you need to use for that.

If you implement IXmlSerializable and the serialisation is by XmlSerialization, then you will have the deserialisation happen through the ReadXml method defined by that interface.

If you implement IDeserializationCallback, then you will have your implementation of OnDeserialization called after the object is constructed. That might be too late for your purposes, but if its enough, then it is probably the easiest to add to an already-existing class.

Upvotes: 0

leppie
leppie

Reputation: 117280

Binary deserialization will NOT call any constructors, AFAIK.

Upvotes: 0

Hide the default constructor using protected modifier.

Read More

Upvotes: 1

Related Questions