[英]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.