What is a practical way to serialize an instance of a subclass using a DataContractSerializer?

What is a practical way to serialize an instance of a subclass using a DataContractSerializer?

For example, data types are listed here:

 [DataContract]
    public class Car
    {
        public Car()
        {
            Wheels = new Collection<Wheel>();
        }

        [DataMember]
        public Collection<Wheel> Wheels { get; set; }
    }

    [DataContract]    
    public abstract class Wheel
    {
        [DataMember]
        public string Name { get; set; }
    }

    [DataContract]
    public class MichelinWheel : Wheel
    {
        [DataMember]
        public string Wheel1Test { get; set; }
    }

    [DataContract]
    public class BridgeStoneWheel : Wheel
    {
        [DataMember]
        public string Wheel2Test { get; set; }
    }

Then here is the code that creates the car with two different wheels:

    Car car = new Car();

    MichelinWheel w1 = new MichelinWheel { Name = "o1", Wheel1Test = "o1 test" };
    BridgeStoneWheel w2 = new BridgeStoneWheel { Name = "o2", Wheel2Test = "o2 test" };

    car.Wheels.Add(w1);
    car.Wheels.Add(w2);

Now, if I try to serialize a car using the DataContractSerializer, I will get an exception saying that MichelinWheel is not expected. And I need to change the Wheel class so that it works:

 [DataContract]
    [KnownType(typeof(MichelinWheel))]
    [KnownType(typeof(BridgeStoneWheel))]
    public abstract class Wheel
    {
        [DataMember]
        public string Name { get; set; }
    }

But this approach is impractical because I cannot list all types of wheels before they are created. And changing the Wheel class every time after creating a new wheel brand is also impractical, since they can be created in third-party code.

, DataContractSerializer?

+3
2

, DataContractResolver WCF 4. KnownTypeAttribute , . , .

+4

.

, , , , .

KnownTypes:

  • ( ),
  • , , Ladislav Mrnka (, , DataContact, , .)
  • (, )
+1

All Articles