看了很多WCF的文章,说到这个就是序列化,本人对序列化不是很懂,看了很久也不明白在WCF中要把Hashtable以及list之类的对象从客户端传到服务器端具体怎么写,
下面的order类在服务器和客户端的数据契约中都有定义。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace DataContracts
{
[DataContract]
public class OrderBase
{
[DataMember]
public Guid ID
{ get; set; }
[DataMember]
public DateTime Date
{ get; set; }
[DataMember]
public string Customer
{ get; set; }
[DataMember]
public string ShipAddress
{ get; set; }
public double TotalPrice
{ get; set; }
}
[DataContract]
public class Order : OrderBase
{
[DataMember]
public string PaymentType
{ get; set; }
}
}
服务器端被调用的函数
[ServiceKnownType(typeof(Order))]
public object RunGlobalDALMethod(string className, string methodName, object[] parameters)
{
try
{
//这里想处理客户端传过来的hashtable和order或list等信息
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
return null;
}
}
客户端示例代码如下:
using (PHMContractsClient calculator_tcp = new PHMContractsClient("NetTcpBinding_IPHMContracts")) //获取服务器通信地址和端口等
{
try
{
Hashtable hs = new Hashtable(); //定义的Hashtable
hs.Add("t1", "ggg");
hs.Add("t2", "ttt");
Order order = new Order() //同时也定义了一个客户端和服务器端都有的Order表
{
ID = Guid.NewGuid(),
Date = DateTime.Today,
Customer = "NCS",
ShipAddress = "#328, Airport Rd, Industrial Park, Suzhou JiangSu Province",
TotalPrice = 8888,
PaymentType = "Credit Card"
};
object[] parameters = new object[] { hs,order };
//调用服务器的函数,希望把hashtable和order传送过去。
DataSet gg = (DataSet) calculator_tcp.RunServerMethod(parameters);
dataGridView1.DataSource = gg.Tables[0].DefaultView;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
结果报错如下:
---------------------------
---------------------------
尝试对参数 http://tempuri.org/ 进行序列化时出错: parameters。InnerException 消息是“数据协定名称为“Order:http://schemas.datacontract.org/2004/07/DataContracts”的类型“DataContracts.Order”不是所需的类型。请将未知的类型以静态方式添加到已知类型的列表,例如,通过使用 KnownTypeAttribute 属性或通过将其添加到传递给 DataContractSerializer 的已知类型的列表等方法。” 。有关详细信息,请参见 InnerException。
不知道如何解决这个问题,对WCF比较菜鸟,望高手帮忙,