简体   繁体   English

序列化一些用户定义的类时,为什么会丢失数据?

[英]Why am I losing data when I serialize some user defined classes?

I have 4 classes: BaseStreamParameter 我有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 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 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;
    }
}

So I have a StreamParameterContainer object whose StreamParameters property contains a RepeatableStreamParameter whose RepeatableParameters property contains 7 StreamParameter objects. 所以我有一个StreamParameterContainer对象,其StreamParameters属性包含一个RepeatableStreamParameter,其RepeatableParameters属性包含7个StreamParameter对象。 This is all true when I make the call to the WCF web service. 当我调用WCF Web服务时,这都是正确的。 On the other end the RepeatableStreamParameter's RepeatableParameters property is empty. 另一方面,RepeatableStreamParameter的RepeatableParameters属性为空。

Can any one tell me why? 谁能告诉我为什么?
is there someway to see what is being sent after I make the call in the client, but before it gets to the server? 有什么办法可以查看我在客户端中进行呼叫之后但到达服务器之前发送的内容?

I tested out your code with: 我用以下方法测试了您的代码:

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

This printed out "test2", as expected. 像预期的那样,这打印出“ test2”。

I acknowledge this is not an answer to your question, but I'm curious if/why you don't see the same results. 我承认这不是您问题的答案,但是我很好奇您是否/为什么看不到相同的结果。

The dll on the server was out of date. 服务器上的dll已过期。 When I updated that everything worked fine. 当我更新时,一切正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么从双精度到十进制会丢失数据 - why am i losing data when going from double to decimal 为什么在使用ReceiveAndDelete时丢失消息? - Why am I losing messages when I use ReceiveAndDelete? 为什么我在这里输了会议? - Why am I losing the Session here? 当我尝试在 .NET Core 中反序列化 FormFile 对象时,为什么会出现奇怪的异常? - Why am I getting a strange exception when I try to de-serialize a FormFile object in .NET Core? 为什么我的 Socket InputStream 会丢失字节? - Why am I losing bytes from my Socket InputStream? 从应用程序中的一个页面导航到另一个页面时,为什么会丢失导航返回条目? - Why am I losing the navigation back entry when I navigate from one of the pages to another page in my application? 我在哪里失去参考? - Where am I losing the reference? 我在尝试XML序列化对象时遇到错误 - I am getting an error when trying to XML serialize an object 在定义变量后,为什么会显示错误消息指示变量不存在? - Why am I getting an error indicating that my variable doesn't exist, when I've already defined it? 在 .Net 中序列化和反序列化 C# 用户定义的类 - Serialize & Deserialize C# user Defined Classes in .Net
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM