请教WCF序列化的问题

蜗牛水里爬 2010-08-20 03:58:36

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Web.Tools
{
[Serializable]
public class MyDrawData
{
public MyDrawData()
{

}
// {MineName:’’,SenID:’’, Degree:’’,SenName:’’,SenType:’’,SenUnit:’’,WarnMax:’’,
// WarnMin:’’,TurnOff:’’,Reset:’’, Link:’’, Max:’’, MaxValue:’’,MinValue:’’,AveValue:’’,
// Data:[{V:’’,S:’’,T:’’, Address:’’},{}]},{
// },

/// <summary>
/// 矿名
/// </summary>
public string MineName;

/// <summary>
/// 传感器编号
/// </summary>
public string SenId;

/// <summary>
/// 开停次数
/// </summary>
public string Degree;

/// <summary>
/// 传感器名称
/// </summary>
public string SenName;

/// <summary>
/// 传感器类型(模拟量)
/// </summary>
public string SenType;

/// <summary>
/// 单位
/// </summary>
public string SenUnit;

/// <summary>
/// 报警上限
/// </summary>
public string WarnMax;

/// <summary>
/// 报警下限
/// </summary>
public string WarnMin;

/// <summary>
/// 断电浓度
/// </summary>
public string TurnOff;

/// <summary>
/// 复电浓度
/// </summary>
public string Reset;

/// <summary>
/// 关联传感器、传感器编号
/// </summary>
public string Link;

/// <summary>
/// 量程上限
/// </summary>
public string Max;

/// <summary>
/// 最大值
/// </summary>
public string MaxValue;

/// <summary>
/// 最小值
/// </summary>
public string MinValue;

/// <summary>
/// 平均值
/// </summary>
public string AveValue;


/// <summary>
/// 数据
/// </summary>
public List<LineData> Data;
/// <summary>
/// 定义Data:[{"V":'当前值',"S":'当前状态',"T":'当前时间}
/// </summary>
[Serializable]
public class LineData
{
/// <summary>
/// 当前值
/// </summary>
public string V;

/// <summary>
/// 当前状态
/// </summary>
public string S;

/// <summary>
/// 当前时间
/// </summary>
public string T;

}


}
}

以上为我定义了一个类,因给定数据源为JSON
下面是把JSON序列化,但是这种序列化Silverlight那头调用不了 我想把数据序列化成WCF可用的DataContract的序列化方法。人菜刚学Silverlight不会请教高手
突然发现CSDN的分现在都泛滥了

[OperationContract]
/// <summary>
/// 获取曲线数据
/// </summary>
/// <param name="pitNumber">矿井编号</param>
/// <param name="arrySendorNumber">传感器编号</param>
/// <param name="startTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="association">关联</param>
///<param name=" stat”>统计</param>
/// <returns></returns>
public List<Web.Tools.MyDrawData> GetChartData(string pitNumber, List<string> arrySendorNumber, DateTime startTime, DateTime endTime, bool association, bool stat)
{
string str = "{MineName:'1',SenID:'2', Degree:'3',SenName:'4',SenType:'5',SenUnit:'',WarnMax:'',WarnMin:'',TurnOff:'',Reset:'', Link:'', Max:'', MaxValue:'',MinValue:'',AveValue:'',Data:[{V:'',S:'',T:'', Address:''},{V:'a',S:'b',T:'c', Address:'d'}]}";
str = "[" + str + "," + str + "]";
System.Web.Script.Serialization.JavaScriptSerializer Serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Web.Tools.MyDrawData> aaa = Serializer.Deserialize<List<Web.Tools.MyDrawData>>(str);
//DataContractSerializer serializer = new DataContractSerializer();
return aaa;
}
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
badi888 2010-08-22
  • 打赏
  • 举报
回复
有点深奥。。。
海涵德 2010-08-21
  • 打赏
  • 举报
回复
要是改成WCF的序列化,我有点经验可供你参考:
http://topic.csdn.net/u/20100421/23/024b3313-8e6d-4718-9818-5452ecbfa1a3.html
jv9 2010-08-20
  • 打赏
  • 举报
回复
首先,需要声明数据成员,添加[DataMember]属性,这样Silverlight客户端才能识别。

例如



[DataContract]
public class MyDrawData
{
public MyDrawData()
{

}
// {MineName:’’,SenID:’’, Degree:’’,SenName:’’,SenType:’’,SenUnit:’’,WarnMax:’’,
// WarnMin:’’,TurnOff:’’,Reset:’’, Link:’’, Max:’’, MaxValue:’’,MinValue:’’,AveValue:’’,
// Data:[{V:’’,S:’’,T:’’, Address:’’},{}]},{
// },

/// <summary>
/// 矿名
/// </summary>
[DataMember]
public string MineName;

/// <summary>
/// 传感器编号
/// </summary>

[DataMember]
public string SenId;


}


}
}




然后,创建操作契约,和你代码相同,进行序列化,这里不需要做单独的反序列化处理,WCF会帮你处理。

给你提供两个JSON开源例程参考,请下载:

http://www.silverlightchina.net/resource/code/JSONProductsDataViewer.rar

http://www.silverlightchina.net/resource/code/ProductsDataJSONService.rar
mengKzhaoyun 2010-08-20
  • 打赏
  • 举报
回复

//实体类集合序列化为字符串
public static string Serializer(Object objToXml)
{
System.IO.StringWriter writer = new System.IO.StringWriter();
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(objToXml.GetType());
serializer.Serialize(writer, objToXml);
return writer.GetStringBuilder().ToString();
}

/// <summary>
/// 反序列化字符串为实体类
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sXml"></param>
/// <returns></returns>
public static T DeSerializer<T>(String sXml)
{
Type type = typeof(T);
XmlReader reader = XmlReader.Create(new StringReader(sXml));
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
object obj = serializer.Deserialize(reader);
return (T)obj;
}

用这个来。。。不需要标记,只需要无参数构造函数。。
蜗牛水里爬 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzy11 的回复:]
郁闷没有问题,自己调用错方法了。。。。。。。。。
无语中
[/Quote]

private string _MineName;
/// <summary>
/// 矿名
/// </summary>
public string MineName
{
set { _MineName = value; }
get { return _MineName; }
}

楼上是这个意思么?
构造函数有啊。。。。。。。。。
public MyDrawData()
{

}
mengKzhaoyun 2010-08-20
  • 打赏
  • 举报
回复
。。。
楼主可以给序列化类加一个空的无参数构造函数,这样安全点。。。
蜗牛水里爬 2010-08-20
  • 打赏
  • 举报
回复
郁闷没有问题,自己调用错方法了。。。。。。。。。
无语中

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧