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. opencv边缘检测的入门剖析(第七天)

    ---边缘检测概念理解--- 边缘检测的理解可以结合前面的内核,说到内核在图像中的应用还真是多,到现在为止学的对图像的操作都是核的操作,下面还有更神奇的! 想把边缘检测出来,从图像像素的角度去想,那就 ...

  2. 进程之间的数据共享 -----Manager模块

    展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中 ...

  3. 通过cookie验证用户登录

    # cookie # cookie# 当你在浏览器登陆时,浏览器记录这个登录信息(服务器响应时发送请求的数据和登录信息),再次访问时 浏览器会将访问请求和缓存的登录信息都发送到服务器, # 服务器通过 ...

  4. python you-get 下载视频

    python使用you-get模块下载视频   pip install you-get # 安装先 怎么用    进入命令行: you-get url 暂停下载:ctrl + c ,继续下载重复  y ...

  5. html调用静态json例子

    1.json { "current": 2, "result": "success" } 1.html <!doctype html& ...

  6. redis详解(一)-- 概述

    首先,分布式缓存框架 可以 看成是nosql的一种 (1)什么是redis? redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的 ...

  7. 使用VB.Net Express版本创建服务

    Services Part 1:>  Creating Services Visual Basic Express is a great, free tool from Microsoft.   ...

  8. 使用REGINI修改注册表权限

    regini regset.ini 就行啦 regset.ini 是你要修改的数据 1.注册表修改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr ...

  9. C#--反射技术

    反射:反射为了动态(比如动态的加载dll,动态创建类型.动态调用方法等) 引用 using System.Reflection 原理: 一个类库编译后会生成一个以.dll结尾的文件,一个以.pdb结尾 ...

  10. 在eclipse中修改生成的注释类、方法的作者、时间

    1.打开eclipse:windos-->preferences-->Java-->Code Style -->Code Templates-->Types-->点 ...