WCF数据契约代理和已知类型的使用
using Bll;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text;
using System.Threading.Tasks;
using System.Xml; namespace Distributed.Model
{
#region 1.1 已知类型KnownType [KnownType(typeof(T))] [DataContract]
//[KnownType(typeof(Bar))]
//[KnownType(typeof(Baz))]
public class Foo
{
}
[DataContract]
public class Bar : Foo
{
}
[DataContract]
public class Baz : Bar
{
}
#endregion #region 1.2 KnownType 指定方法名 GetKnownTypes
//[DataContract]
//[KnownType("GetKnownTypes")]
//public class Foo
//{
// public static IEnumerable<Type> GetKnownTypes()
// {
// yield return typeof(Bar);
// yield return typeof(Baz);
// } //}
#endregion #region 2. ServiceKnownType指定解析类KnownTypeResolver和方法GetKnownTypes
[ServiceContract(Namespace = "www.holworth.com")]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeResolver))]
public interface IContract
{
[OperationContract]
void DoSomething(Foo foo); }
public static class KnownTypeResolver
{
public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
{
yield return typeof(Bar);
yield return typeof(Baz);
}
}
#endregion [DataContract]
public class Contract
{
[DataMember]
public string FullName { get; set; }
[DataMember]
public string Sex { get; set; }
}
[DataContract]
public class Custmoer
{
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public string Gender { get; set; } }
/// <summary>
/// 目标进入契约对象,出来也是契约对象
/// </summary>
public class ContractSurrogate : IDataContractSurrogate
{
public Type GetDataContractType(Type type)
{
if (type == typeof(Contract))
{
return typeof(Custmoer);
}
return type;
}
/// <summary>
/// obj
/// </summary>
/// <param name="obj">obj是序列化之后的对象,我们的目标是反序列化得到原始类型Contract</param>
/// <param name="targetType"></param>
/// <returns></returns>
public object GetDeserializedObject(object obj, Type targetType)
{
Custmoer customer = obj as Custmoer;
if (customer == null)
{
return obj;
}
return new Contract()
{
FullName = customer.FirstName + " " + customer.LastName,
Sex = customer.Gender
};
}
/// <summary>
///
/// </summary>
/// <param name="obj">原始契约对象类型Contract</param>
/// <param name="targetType"></param>
/// <returns></returns>
public object GetObjectToSerialize(object obj, Type targetType)
{
Contract contract = obj as Contract;
if (contract == null)
{
return obj;
}
return new Custmoer()
{
FirstName = contract.FullName.Split(" ".ToCharArray())[],
LastName = contract.FullName.Split(" ".ToCharArray())[],
Gender = contract.Sex
};
}
public void GetKnownCustomDataTypes(Collection<Type> customDataTypes)
{ } public object GetCustomDataToExport(Type clrType, Type dataContractType)
{
return null;
} public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
{
return null;
}
public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
{
return null;
}
public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
{
return typeDeclaration;
} } public class Program
{
public static void Serializer<T>(T instance, string fileName, IDataContractSurrogate dataContractSurrogate)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, false, dataContractSurrogate);
using (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
{
serializer.WriteObject(writer, instance);
Process.Start(fileName);
}
}
public static T Deserializer<T>(string fileName, IDataContractSurrogate dataContractSurrogate)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T), null, int.MaxValue, false, false, dataContractSurrogate);
using (XmlReader reader = new XmlTextReader(fileName))
{
return (T)serializer.ReadObject(reader);
} }
public static void Host()
{
using (ServiceHost serviceHost = new ServiceHost(typeof(BasCurrencyService)))
foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
{
foreach (OperationDescription op in ep.Contract.Operations)
{
DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior;
if (op.Behaviors.Find<DataContractSerializerOperationBehavior>() != null)
{
dataContractBehavior.DataContractSurrogate = new ContractSurrogate();
}
op.Behaviors.Add(op.Behaviors.Find<DataContractSerializerOperationBehavior>());
dataContractBehavior = new DataContractSerializerOperationBehavior(op);
dataContractBehavior.DataContractSurrogate =new ContractSurrogate();
op.Behaviors.Add(dataContractBehavior);
}
}
}
public static void main(string[] args)
{
//1.1 实验输出
string fileName = "contract.xml";
Contract contract = new Contract() { FullName = "ke xiangbin", Sex = "Male" };
IDataContractSurrogate dataContractSurrogate = new ContractSurrogate();
Serializer<Contract>(contract, fileName, dataContractSurrogate);
Console.WriteLine("序列化前");
Console.WriteLine("\t{0,-9}:{1}", "FullName", contract.FullName);
Console.WriteLine("\t{0,-9}:{1}", "Sex", contract.Sex);
contract = Deserializer<Contract>(fileName, dataContractSurrogate);
Console.WriteLine("反序列化后");
Console.WriteLine("\t{0,-9}:{1}", "FullName", contract.FullName);
Console.WriteLine("\t{0,-9}:{1}", "Sex", contract.Sex);
//1.2 服务寄宿应用数据契约代理
Host();
Console.ReadKey();
}
} }
WCF数据契约代理和已知类型的使用的更多相关文章
- WCF 已知类型和泛型解析程序 KnownType
数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...
- WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...
- WCF 之 已知类型(KnownType)
已知类型(Known types)允许在服务契约中使用多态的行为,在服务操作中暴露基本类型.将已知类型(known types)相关到基本类型(基类类型)自身;特定操作;整个服务契约采用属性声明或者配 ...
- 跟我一起学WCF(7)——WCF数据契约与序列化详解
一.引言 在前面博文介绍到,WCF的契约包括操作契约.数据契约.消息契约和错误契约,前面一篇博文已经结束了操作契约的介绍,接下来自然就是介绍数据契约了.所以本文要分享的内容就是数据契约. 二.数据契约 ...
- C# 序列化过程中的已知类型(Known Type)
WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...
- WCF分布式开发步步为赢(7):WCF数据契约与序列化
本节继续学习WCF分布式开发步步为赢(7):WCF数据契约与序列化.数据契约是WCF应用程序开发中一个重要的概念,毫无疑问实现客户端与服务端数据契约的传递中序列化是非常重要的步骤.那么序列化是什么?为 ...
- WCF数据契约
当使用DataMember时,和访问符无关,及时使用了private,成员都是可见的.相反如果使用static,为不可见. 上述的两个数据成员是等效的,如果是等效的话 数据成员的顺序也必须是相同的. ...
- java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量
package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...
随机推荐
- selenium+python自动化90-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
- 地址解析协议ARP(Address Resolution Protocol)
1.引言 说明: ARP的作用,解决了什么问题: 以太网中的链路层,可能会采用不同的网络技术,而且不以ip作为路由依据. 链路层以mac地址作为路由依据. ARP的功能是在32 bit的IP地址和采用 ...
- 使用Larave5.6l提交POST请求出现The page has expired due to inactivity错误
使用Larave5.6l提交POST请求出现The page has expired due to inactivity错误 一般是由于没有添加 csrf造成的 在表单下面的 第一个行 添加如下代码即 ...
- zabbix3.4.7 饼图显示问题
最近安装了zabbix3.4.7,发现系统自带Template OS Linux模版饼图(Pie)有两个问题: Total disk space on / 显示为 no data,也就是没有数据: 把 ...
- 77. sqlserver 锁表解决方式
select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tra ...
- javaScript日期
日历 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <head> <t ...
- Mysql 获取当天,昨天,本周,本月,上周,上月的起始时间
转自: http://www.cppblog.com/tx7do/archive/2017/07/19/215119.html -- 今天 SELECT DATE_FORMAT(NOW(),'%Y-% ...
- fiddler 修改request请求
例:在request url后追加&test=1参数 在OnBeforeRequest函数中添加以下代码 if(oSession.uriContains("www.bing.com/ ...
- salt之grains组件
grains是saltstack最重要的组件之一,作用是收集被控主机的基本信息,这些信息通常都是一些静态类的数据,包括CPU.内核.操作系统.虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可 ...
- unity WWW加载进度条
using UnityEngine; using System.Collections; public class testProgress : MonoBehaviour { void Start ...