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数据契约代理和已知类型的使用的更多相关文章

  1. WCF 已知类型和泛型解析程序 KnownType

    数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...

  2. WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

    原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...

  3. WCF技术剖析之十三:序列化过程中的已知类型(Known Type)

    原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...

  4. WCF 之 已知类型(KnownType)

    已知类型(Known types)允许在服务契约中使用多态的行为,在服务操作中暴露基本类型.将已知类型(known types)相关到基本类型(基类类型)自身;特定操作;整个服务契约采用属性声明或者配 ...

  5. 跟我一起学WCF(7)——WCF数据契约与序列化详解

    一.引言 在前面博文介绍到,WCF的契约包括操作契约.数据契约.消息契约和错误契约,前面一篇博文已经结束了操作契约的介绍,接下来自然就是介绍数据契约了.所以本文要分享的内容就是数据契约. 二.数据契约 ...

  6. C# 序列化过程中的已知类型(Known Type)

    WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...

  7. WCF分布式开发步步为赢(7):WCF数据契约与序列化

    本节继续学习WCF分布式开发步步为赢(7):WCF数据契约与序列化.数据契约是WCF应用程序开发中一个重要的概念,毫无疑问实现客户端与服务端数据契约的传递中序列化是非常重要的步骤.那么序列化是什么?为 ...

  8. WCF数据契约

    当使用DataMember时,和访问符无关,及时使用了private,成员都是可见的.相反如果使用static,为不可见. 上述的两个数据成员是等效的,如果是等效的话 数据成员的顺序也必须是相同的. ...

  9. java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量

    package com.swift.kuozhan; import java.io.File; import java.io.FileFilter; /*使用文件过滤器筛选将指定文件夹下的小于200K ...

随机推荐

  1. PCB的初次窥探

    第一次画PCB经常用到的知识点 鼠标拖动+X      :左右转动(对称) +space:90度转动 +L      :顶层与底层的切换 Ctrl+M:测量 J + C:查找原件 交叉探针+原理图(P ...

  2. nslookup域名解析

    域名解析 nslookup docker.xxx.com.cn

  3. 24. Swap Nodes in Pairs + 25. Reverse Nodes in k-Group

    ▶ 问题:单链表中的元素进行交换或轮换. ▶ 24. 每两个元素进行翻转.如 [1 → 2 → 3 → 4 → 5] 变换为 [2 → 1 → 4 → 3 → 5] ● 初版代码,4 ms class ...

  4. libcurl 不支持https访问

    项目中使用libcurl 访问https的时候会报错,比如:“Unsupported protocol” 或者:“Protocol https not supported or disabled in ...

  5. python 安装mysqldb组件

    只能源码安装 源码下载: http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/ http://sourcefor ...

  6. 控制html元素的隐藏问题

    控制元素隐藏的方式,有display:none.visibility:hidden以及不透明度设置. 一.display:none 被隐藏的元素,在页面中不占位,空出的位置会被相邻的元素占用. < ...

  7. mysql 存储过程分页 转载

    /* --名称:MYSQL版查询分页存储过程 by peace 2013-8-14 --输入参数:@fields -- 要查询的字段用逗号隔开 --输入参数:@tables -- 要查询的表 --输入 ...

  8. 【346】TF-IDF

    Ref: 文本挖掘预处理之向量化与Hash Trick Ref: 文本挖掘预处理之TF-IDF Ref: sklearn.feature_extraction.text.CountVectorizer ...

  9. Java中static代码块,{}大括号代码块,构造方法代码块执行顺序!

    注:下列代码中的注释都是JUnit4单元测试运行结果. 首先,没有父类的(父类是Object)的类A package Static.of; public class A { { System.out. ...

  10. Chi-Square Statistic/Distribution

    . 1.What is a Chi Square Test? 卡方检验有两种类型.两者使用卡方统计量和分布的目的不同. 第一种:卡方拟合优度检验确定样本数据是否与总体匹配.(这里不介绍) 第二种:独立 ...