WCF 序列化与反序列化复杂类型(DataContractSerializer)

.NET的类型可以分为两种:声明类型和真实类型。我们提倡面向接口的编程,对象的真实类型往往需要在运行时才能确定,在编程的时候往往只需要指明类型的声明类型,比如类型实现的接口或者抽象类。当我们使用基于接口或者抽象类创建的DataContractSerializer去序列化一个实现了该接口或者继承该抽象类的实例的时候,往往会因为对对象的真实类型无法识别造成不能正常地序列化。

现在,我们定义两个带数据协定的类——ActionInfo和ActionParameterInfo:

/// <summary>/// 动作信息/// </summary>[DataContract(Namespace = "")][KnownType("GetKnowTypes")]//[KnownType("GetKnowTypesQuote")]public class ActionInfo{private string actionName;/// <summary>/// 动作名称/// </summary>[DataMember]public String ActionName{get { return actionName; }set { actionName = value; }}private string actionId;/// <summary>/// 动作唯一标识/// </summary>[DataMember]public String ActionId{get { return actionId; }set { actionId = value; }}private Dictionary<string, ActionParameterInfo> actionParameters;/// <summary>/// 参数信息/// </summary>[DataMember]public Dictionary<string, ActionParameterInfo> ActionParameters{get{if (actionParameters == null){actionParameters = new Dictionary<string, ActionParameterInfo>();}return actionParameters;}set{actionParameters = value;}}static Type[] GetKnowTypes(){return new Type[] { typeof(Dictionary<string, ActionParameterInfo>) };}//[DataMember]//public object Quote;//static Type[] GetKnowTypesQuote()//{// return new Type[] { typeof(Dictionary<string, int>) };//}} /// <summary>/// 动作参数/// </summary>//[DataContract(Namespace = "")][DataContract]public class ActionParameterInfo{private bool parameterAllowDBNull;/// <summary>/// 参数是否允许为空/// </summary>//[DataMember(Name = "参数是否允许为空", Order = 2)][DataMember]public bool ParameterAllowDBNull{get { return parameterAllowDBNull; }set { parameterAllowDBNull = value; }}private ActionInfoParameterCategoryEnum parameterCategory;/// <summary>/// 参数分类/// </summary>//[DataMember(Name = "参数分类", Order = 3)][DataMember]public ActionInfoParameterCategoryEnum ParameterCategory{get { return parameterCategory; }set { parameterCategory = value; }}private object parameterValue;/// <summary>/// 参数值/// </summary>//[DataMember(Name = "参数值", Order = 1)][DataMember]public object ParameterValue{get { return parameterValue; }set { parameterValue = value; }}private string parameterCode;/// <summary>/// 参数编号(未添加DataMember标识)/// </summary>public string ParameterCode{get { return parameterCode; }set { parameterCode = value; }} public enum ActionInfoParameterCategoryEnum{[Description("普通类型")]CommonType = 0,[Description("事件源")]EventSource = 1,[Description("事件参数")]EventArgument = 2,[Description("控件ID")]ControlId = 3,[Description("表单ID")]FormId = 4}

在代码中添加以下代码填充实体类:

ActionInfo ac = new ActionInfo();ac.ActionId = "ActionId" + Guid.NewGuid().ToString();ac.ActionName = "ActionName" + Guid.NewGuid().ToString();ac.ActionParameters = new Dictionary<string, ActionParameterInfo>();for (int i = 0; i < 2; i++){ActionParameterInfo ap = new ActionParameterInfo();ap.ParameterAllowDBNull = false;ap.ParameterCategory = ActionInfoParameterCategoryEnum.CommonType;ap.ParameterValue = Guid.NewGuid();ac.ActionParameters.Add(ap.ParameterValue.ToString(), ap);} 测试序列化: string ss = PubXmlSerializer<ActionInfo>.ToXMLString(ac);生成的xml如下:<ActionInfo xmlns="" xmlns:i=""><ActionId>ActionIdb9da9159-068e-4cae-9810-5e2ca4f0a87f</ActionId><ActionName>ActionName70737f3b-1672-437e-8ad5-543038ac62b4</ActionName><ActionParameters xmlns:a=""><a:KeyValueOfstringActionParameterInfo0UA3f0ok><a:Key>4e059222-023f-40aa-b08e-42e377570092</a:Key><a:Value xmlns:b=""><b:ParameterAllowDBNull>false</b:ParameterAllowDBNull><b:ParameterCategory>CommonType</b:ParameterCategory><b:ParameterValue i:type="c:guid" xmlns:c="">4e059222-023f-40aa-b08e-42e377570092</b:ParameterValue></a:Value></a:KeyValueOfstringActionParameterInfo0UA3f0ok><a:KeyValueOfstringActionParameterInfo0UA3f0ok><a:Key>5c528920-a7c6-4fc4-8632-a2f083d43676</a:Key><a:Value xmlns:b=""><b:ParameterAllowDBNull>false</b:ParameterAllowDBNull><b:ParameterCategory>CommonType</b:ParameterCategory><b:ParameterValue i:type="c:guid" xmlns:c="">5c528920-a7c6-4fc4-8632-a2f083d43676</b:ParameterValue></a:Value></a:KeyValueOfstringActionParameterInfo0UA3f0ok></ActionParameters></ActionInfo>

从xml看到:

不求与人相比,但求超越自己,要哭就哭出激动的泪水,要笑就笑出成长的性格。

WCF 序列化与反序列化复杂类型(DataContractSerializer)

相关文章:

你感兴趣的文章:

标签云: