2010-10-29 3 views
1

J'ai 4 classes: BaseStreamParameterPourquoi est-ce que je perds des données lorsque je sérialise certaines classes définies par l'utilisateur?

[DataContract] 
[KnownType(typeof(StreamParameter))] 
[KnownType(typeof(RepeatableStreamParameter))] 
public class BaseStreamParameter 
{ 
    private bool pIsRepeatable; 
    [DataMember] 
    public bool IsRepeatable 
    { 
     get { return pIsRepeatable; } 
     set { pIsRepeatable = value; } 
    } 
    private bool pIsFBlock; 
    [DataMember] 
    public bool IsFBlock 
    { 
     get { return pIsFBlock; } 
     set { pIsFBlock = value; } 
    } 

    private string pParamName; 
    [DataMember] 
    public string ParamName 
    { 
     get { return pParamName; } 
     set { pParamName = value; } 
    } 


    public BaseStreamParameter(bool aIsRepeatable, bool aIsFBlock, string aParamName) 
    { 
     pIsFBlock = aIsFBlock; 
     pIsRepeatable = aIsRepeatable; 
     pParamName = aParamName; 
    } 

    public BaseStreamParameter(string aParamName) 
    { 
     pIsFBlock = false; 
     pIsRepeatable = false; 
     pParamName = aParamName; 
    } 

RepeatableStreamParameter

[DataContract] 
public class RepeatableStreamParameter : BaseStreamParameter 
{ 
    private List<BaseStreamParameter> pRepeatableParameters; 
    [DataMember] 
    public List<BaseStreamParameter> RepeatableParameters 
    { 
     get { return pRepeatableParameters; } 
     set { pRepeatableParameters = value; } 
    } 

    public RepeatableStreamParameter(bool aIsFBlock, string aParamName) 
     : base(true, aIsFBlock, aParamName) 
    { 
     pRepeatableParameters = new List<BaseStreamParameter>(); 
    } 
} 

StreamParameter

[DataContract] 
public class StreamParameter : BaseStreamParameter 
{ 
    private string pParamType; 
    [DataMember] 
    public string ParamType 
    { 
     get { return pParamType; } 
     set { pParamType = value; } 
    } 

    private string pParamValue; 
    [DataMember] 
    public string ParamValue 
    { 
     get { return pParamValue; } 
     set { pParamValue = value; } 
    } 
    private bool pIsEnum; 
    [DataMember] 
    public bool IsEnum 
    { 
     get { return pIsEnum; } 
     set { pIsEnum = value; } 
    } 
    private List<string> pEnumList; 
    [DataMember] 
    public List<string> EnumList 
    { 
     get { return pEnumList; } 
     set { pEnumList = value; } 
    } 

    public StreamParameter(bool aIsFBlock, string aParamName, string aParamType, string aParamValue, bool aIsEnum, List<string> aEnumList) 
     : base(false, aIsFBlock, aParamName) 
    { 
     pParamType = aParamType; 
     pParamValue = aParamValue; 
     pIsEnum = aIsEnum; 
     pEnumList = aEnumList; 
    } 

    public StreamParameter(bool aIsFBlock, string aParamName, string aParamType, string aParamValue) 
     : base(false, aIsFBlock, aParamName) 
    { 
     pParamType = aParamType; 
     pParamValue = aParamValue; 
     pIsEnum = false; 
     pEnumList = null; 
    } 
} 

StreamParameterContainer

[DataContract] 
[KnownType(typeof(StreamParameterContainer))] 
public class StreamParameterContainer : BaseStreamParameter 
{ 
    private List<BaseStreamParameter> pStreamParameters; 
    public StreamParameterContainer(string aParamName) 
     : base(aParamName) 
    { 
     pStreamParameters = new List<BaseStreamParameter>(); 
    } 
    [DataMember] 
    public List<BaseStreamParameter> StreamParameters 
    { 
     get { return pStreamParameters; } 
     set { pStreamParameters = value; } 
    } 

    public int GetCountOfNonRepeatingParameters() 
    { 
     int count = 0; 
     foreach (BaseStreamParameter bsp in pStreamParameters) 
     { 
      if (bsp is StreamParameter) 
       count++; 
     } 
     return count; 
    } 
} 

J'ai donc un objet StreamParameterContainer dont la propriété StreamParameters contient un RepeatableStreamParameter dont la propriété RepeatableParameters contient 7 objets StreamParameter. Tout cela est vrai lorsque je fais l'appel au service Web WCF. À l'autre extrémité, la propriété RepeatableParameters de RepeatableStreamParameter est vide.

Quelqu'un peut-il me dire pourquoi?
Y at-il une certaine façon de voir ce qui est envoyé après que je fais l'appel dans le client, mais avant qu'il arrive au serveur?

+0

Vos classes n'ont-elles pas besoin de constructeurs noarg? –

+0

Je suppose que non. Il fonctionne de la même façon avec ou sans contrastes arg. – scott

Répondre

0

La DLL sur le serveur était obsolète. Quand j'ai mis à jour que tout a bien fonctionné.

1

J'ai testé votre code avec:

DataContractSerializer serializer = new DataContractSerializer(typeof(BaseStreamParameter)); 

MemoryStream stream = new MemoryStream(); 
var parameter = new BaseStreamParameter.RepeatableStreamParameter(true, "test"); 
parameter.RepeatableParameters.Add(new BaseStreamParameter("test2")); 
serializer.WriteObject(stream, parameter); 

stream.Position = 0; 
var read = (BaseStreamParameter.RepeatableStreamParameter)serializer.ReadObject(stream); 
Console.WriteLine(read.RepeatableParameters[0].ParamName); 

Cet imprimé "test2", comme prévu.

Je reconnais que ce n'est pas une réponse à votre question, mais je suis curieux de savoir si/pourquoi vous ne voyez pas les mêmes résultats.

+0

Moi aussi. Quand je cours votre code dans un projet séparé, j'obtiens le même résultat. est-il possible qu'un sérialiseur différent soit utilisé? Je ne pense pas en avoir explicitement défini un où que ce soit. – scott

Questions connexes