Почему я теряю данные при сериализации некоторых пользовательских классов? - PullRequest
1 голос
/ 29 октября 2010

У меня есть 4 класса: BaseStreamParameter

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

Итак, яиметь объект StreamParameterContainer, свойство StreamParameters которого содержит RepeatableStreamParameter, свойство RepeatableParameters которого содержит 7 объектов StreamParameter.Это все верно, когда я звоню в веб-сервис WCF.На другом конце свойство RepeatableParameters RepeatableStreamParameter пусто.

Может кто-нибудь сказать мне, почему?
есть какой-нибудь способ увидеть, что отправляется после того, как я сделаю вызов в клиенте, но до того, как он доберется досервер?

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Я проверил ваш код с:

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);

Это распечатано "test2", как и ожидалось.

Я признаю, что это не ответ на ваш вопрос, но мне любопытно, если / почему вы не видите такие же результаты.

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

DLL на сервере устарел.Когда я обновил, что все работало нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...