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. django-媒体文件,图片存储

    1.settings.py # 媒体文件 MEDIA_ROOT = 'media/'

  2. 用google-code-prettify高亮代码

    示例: https://code.google.com/p/google-code-prettify/wiki/GettingStarted 主题如何使用google-code-prettify高亮代 ...

  3. DDoS攻防战 (二) :CC攻击工具实现与防御理论

    故上兵伐谋 其次伐交 其次伐兵 其下攻城 攻城之法 为不得已 知己知彼 百战不殆 不知彼而知己 一胜一负 不知彼不知己 每战必败 ——孙子兵法·谋攻 我们将要实现一个进行应用层DDoS攻击的工具,综合 ...

  4. ListView 操作

    TListItem *Item; ; i < ; i++) { Item = ListView1->Items->Add(); Item->Caption = i; } Lis ...

  5. air 桌面应用发布后可以删除的文件

    ****\Adobe AIR\Versions\1.0 下的文件夹Resources,可以整个删除 ***META-INF\AIR目录下的application.xml配置文件可修改initialWi ...

  6. as2 针对加载进来的swf操作

    如果加载的子swf,里面的东西会随时发生变化,那么as2获取的子swf宽高也会不停在变动. 解决方法,就是在子swf里面控制设置方法,当as2需要准确获取子swf宽高时,迫使子宽高恢复到原本样子,这样 ...

  7. 前端-CSS-11-Z-index

    ---- z-index 这个东西非常简单,它有四大特性,每个特性你记住了,页面布局就不会出现找不到盒子的情况. z-index 值表示谁压着谁,数值大的压盖住数值小的, 只有定位了的元素,才能有z- ...

  8. Algorithm-多目标优化-博文路径

    参考博文: 多目标进化算法(MOEA)概述: https://blog.csdn.net/qithon/article/details/72885053 多目标优化问题的算法及其求解: https:/ ...

  9. springMVC学习记录3-拦截器和文件上传

    拦截器和文件上传算是springmvc中比较高级一点的内容了吧,让我们一起看一下. 下面先说说拦截器.拦截器和过滤器有点像,都可以在请求被处理之前和请求被处理之到做一些额外的操作. 1. 实现Hand ...

  10. Imageen 图像切割 (JpegLosslessTrans)

    procedure CutAFile(FileName: string; qry: TQuery);var  i: Cardinal;  FromStream, ToStream: TMemorySt ...