2010-09-24 4 views
2

Après avoir lu la documentation et de nombreux articles, je crois que les éléments suivants devraient fonctionner, mais ce n'est pas le cas.KnownType Sérialisation Problème

C'est ainsi que mes contrats de données sont structurés.

[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; }} 
} 

Le client envoie l'objet exemple suivant:

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

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

tom.Location = office; 

La question est pour une raison aucune des valeurs de place sont sérialisés.

Quelle erreur suis-je en train de faire?

Merci.

+0

est l'altitude se sérialisé ou rien en ce qui concerne l'endroit du tout? ? – Jeff

+0

Aucune propriété de Place n'est sérialisée lorsque le client soumet la personne – mob1lejunkie

+0

Problèmes de couple: 1) Votre code client ne se compile pas: office.ZipCode n'est pas une affectation valide. 2) J'ai collé vos contrats de données dans VS2010, fait une fonction qui retourne une "Personne", et l'ai appelée en utilisant le conteneur de test WCF. Ça a marché. Donc, le problème est probablement avec le code qui n'est pas montré dans la question. – ErnieL

Répondre

0

Après beaucoup de frustration se révèle ma conception de DataContract était défectueux :(

+2

Prendre soin de partager la faille? Plusieurs personnes ont mis du temps à essayer de comprendre votre problème. Ce serait bien si vous partagiez la cause racine maintenant que vous l'avez trouvé. – ErnieL

+1

Dans la mise en œuvre réelle à la fois personne et ami avait référence à la localisation. Le client définissait des propriétés sur l'objet Location dans la personne mais pas sur l'objet Emplacement sur Friend. C'était la raison pour laquelle les propriétés de l'objet Location n'étaient pas sérialisées. – mob1lejunkie

0

DataContract utilise opt-in, Serializeable utilise la désactivation. C'est pourquoi cela fonctionne en utilisant Serializeable. Vous devez marquer les champs d'accompagnement comme DataMembers, pas les propriétés:

[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; }} 
} 
+0

1) Je n'ai pas essayé d'utiliser Serializable, j'ai testé avec DataContractSerializer. – mob1lejunkie

+0

2) Selon la documentation, l'attribut DataMember peut être appliqué aux propriétés, donc je ne pense pas que ce soit le problème. http://msdn.microsoft.com/en-us/library/ms730167(v=VS.85).aspx – mob1lejunkie

Questions connexes