当前位置: 代码迷 >> Web Service >> 在WCF中怎么实现接口反序列化和序列化为JSON
  详细解决方案

在WCF中怎么实现接口反序列化和序列化为JSON

热度:181   发布时间:2016-05-02 02:16:50.0
在WCF中如何实现接口反序列化和序列化为JSON
求助啊,最近在使用WCF写服务,客户端需要传递一个接口类型,服务器接收,有哪位高人知道啊!
------解决思路----------------------
传递一个借口类型?  不是太明白啊。。。。你可以事先定义借口枚举,传枚举就可以了,,可以实现你的功能的
------解决思路----------------------
写个json转换类

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    using System.Web;  
    using System.Web.Script.Serialization;  
    using System.Data;   
      
      
    namespace tanyong.DB.JsonHelper  
    {  
        /// <summary>   
        /// JSON帮助类   
        /// </summary>   
        public class JSONHelper  
        {  
            /// <summary>   
            /// 对象转JSON   
            /// </summary>   
            /// <param name="obj">对象</param>   
            /// <returns>JSON格式的字符串</returns>   
            public static string ObjectToJSON(object obj)  
            {  
                JavaScriptSerializer jss = new JavaScriptSerializer();  
                try  
                {  
                    return jss.Serialize(obj);  
                }  
                catch (Exception ex)  
                {  
      
                    throw new Exception("JSONHelper.ObjectToJSON(): " + ex.Message);  
                }  
            }  
      
            /// <summary>   
            /// 数据表转键值对集合   
            /// 把DataTable转成 List集合, 存每一行   
            /// 集合中放的是键值对字典,存每一列   
            /// </summary>   
            /// <param name="dt">数据表</param>   
            /// <returns>哈希表数组</returns>   
            public static List<Dictionary<string, object>> DataTableToList(DataTable dt)  
            {  
                List<Dictionary<string, object>> list  
                     = new List<Dictionary<string, object>>();  
      
                foreach (DataRow dr in dt.Rows)  
                {  
                    Dictionary<string, object> dic = new Dictionary<string, object>();  
                    foreach (DataColumn dc in dt.Columns)  
                    {  
                        dic.Add(dc.ColumnName, dr[dc.ColumnName]);  
                    }  
                    list.Add(dic);  
                }  
                return list;  
            }  
      
            /// <summary>   
            /// 数据集转键值对数组字典   
            /// </summary>   
            /// <param name="dataSet">数据集</param>   
            /// <returns>键值对数组字典</returns>   
            public static Dictionary<string, List<Dictionary<string, object>>> DataSetToDic(DataSet ds)  
            {  
                Dictionary<string, List<Dictionary<string, object>>> result = new Dictionary<string, List<Dictionary<string, object>>>();  
      
                foreach (DataTable dt in ds.Tables)  
                    result.Add(dt.TableName, DataTableToList(dt));  
      
                return result;  
            }  
      
            /// <summary>   
            /// 数据表转JSON   
            /// </summary>   
            /// <param name="dataTable">数据表</param>   
            /// <returns>JSON字符串</returns>   
            public static string DataTableToJSON(DataTable dt)  
            {  
                return ObjectToJSON(DataTableToList(dt));  
            }  
      
            /// <summary>   
            /// JSON文本转对象,泛型方法   
            /// </summary>   
            /// <typeparam name="T">类型</typeparam>   
            /// <param name="jsonText">JSON文本</param>   
            /// <returns>指定类型的对象</returns>   
            public static T JSONToObject<T>(string jsonText)  
            {  
                JavaScriptSerializer jss = new JavaScriptSerializer();  
                try  
                {  
                    return jss.Deserialize<T>(jsonText);  
                }  
                catch (Exception ex)  
                {  
                    throw new Exception("JSONHelper.JSONToObject(): " + ex.Message);  
                }  
            }  
      
            /// <summary>   
            /// 将JSON文本转换为数据表数据   
            /// </summary>   
            /// <param name="jsonText">JSON文本</param>   
            /// <returns>数据表字典</returns>   
            public static Dictionary<string, List<Dictionary<string, object>>> TablesDataFromJSON(string jsonText)  
            {  
                return JSONToObject<Dictionary<string, List<Dictionary<string, object>>>>(jsonText);  
            }  
      
            /// <summary>   
            /// 将JSON文本转换成数据行   
            /// </summary>   
            /// <param name="jsonText">JSON文本</param>   
            /// <returns>数据行的字典</returns>   
            public static Dictionary<string, object> DataRowFromJSON(string jsonText)  
            {  
                return JSONToObject<Dictionary<string, object>>(jsonText);  
            }   
      
        }  
    }  

调用
[code]
       public string DataTableToJSON(DataTable dt)
        {
            try
            {
                OrderTrackRouter_IService client = WCFClientProxy<OrderTrackRouter_IService>.GetReusableFaultUnwrappingInstance("OrderTrackRouterService");
                using (client as IDisposable)
                {
                    return client.DataTableToJSON(dt);
                }
            }
            catch (Exception ex)
            {
                return ex.Message.ToString();
            }
        }
[/code]

------解决思路----------------------

       public string DataTableToJSON(DataTable dt) 
        {
            try
            {
                OrderTrackRouter_IService client = WCFClientProxy<OrderTrackRouter_IService>.GetReusableFaultUnwrappingInstance("OrderTrackRouterService");
                using (client as IDisposable)
                {
                    return client.DataTableToJSON(dt) ;
                }
            }
            catch (Exception ex)
            {
                return ex.Message.ToString();
            }
        }


web.config配置服务

  <!-- begin wcf service -->
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpExpenseService_ForSupplier" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="20000000" maxBufferSize="20000000" maxConnections="10" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="8192000" maxArrayLength="8192000" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
            <message clientCredentialType="Windows"/>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint name="OrderTrackRouterService" 
                address="net.tcp://127.0.0.1:5668/Uzai.Service.Implement.Travel.Supplyer.OrderTrackRouter_Service" 
                contract="Uzai.Service.Interface.Travel.Supplyer.OrderTrackRouter_IService" 
                binding="netTcpBinding"
                bindingConfiguration="netTcpConfig"></endpoint>
    </client>
  </system.serviceModel>
  <!-- end wcf service -->

------解决思路----------------------
可以,但是你要把实现的接口的所有类型都告诉客户端。

查查 KnowType 特性。
  相关解决方案