Проблема сериализации KnownType - PullRequest
2 голосов
/ 24 сентября 2010

Прочитав документацию и многие другие статьи, я считаю, что следующее должно работать, но это не так.

Так структурируются мои контракты.

[DataContract]
[KnownType(typeof(Friend))]
public class Person
{
   private string name;

   [DataMember]
   public string Name { get { return name; } set { name = value; }}

   private Place location;

   [DataMember]
   public Place Location { get { return location; } set { location = value; }}
}

[DataContract]
public class Friend : Person
{
   private int mobile;

   [DataMember]
   public int Mobile { get { return mobile; } set { mobile = value; }}
}

[DataContract]
[KnownType(typeof(City))]
public class Place
{
   private int altitude;

   [DataMember]
   public int Altitude { get { return altitude; } set { altitude = value; }}
}

[DataContract]
public class City : Place
{
   private int zipCode;

   [DataMember]
   public int ZipCode { get { return zipCode; } set { zipCode = value; }}
}

Клиент отправляетследующий пример объекта:

Person tom = new Friend();
tom.Name = "Tom";

Place office = new City();
office.Altitude = 500;
office.ZipCode = 900500;

tom.Location = office;

По какой-то причине ни одно из значений Place не сериализовано.

Какую ошибку я совершаю?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2010

После большого разочарования выясняется, что мой дизайн данных был некорректен: (

0 голосов
/ 27 сентября 2010

DataContract использует opt-in, Serializeable использует Opt-in.Вот почему это работает при использовании Serializeable.Вам необходимо пометить вспомогательные поля как DataMembers, а не свойства:

[DataContract]
[KnownType(typeof(Friend))]
public class Person
{
   [DataMember]
   private string name;

   public string Name { get { return name; } set { name = value; }}

   [DataMember]
   private Place location;

   public Place Location { get { return location; } set { location = value; }}
}

[DataContract]
public class Friend : Person
{
   [DataMember]
   private int mobile;

   public int Mobile { get { return mobile; } set { mobile = value; }}
}

[DataContract]
[KnownType(typeof(City))]
public class Place
{
   [DataMember]
   private int altitude;

   public int Altitude { get { return altitude; } set { altitude = value; }}
}

[DataContract]
public class City : Place
{
   [DataMember]   
   private int zipCode;

   public int ZipCode { get { return zipCode; } set { zipCode = value; }}
}
...