服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。

一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所示。

[DataContract]

public class UserInfo

{

//….

}

只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember,如下所示。

[DataContract]

public class UserInfo

{

[DataMember]

public string UserName

{

get;

set;

}

[DataMember]

public int Age

{

get;

set;

}

[DataMember]

public string Location

{

get;

set;

}

public string Zodiac

{

get;

set;

}

}

上面这段代码把UserInfo类声明为DataContract,将UserName、Age、Location这3个属性声明为DataMember(数据成员)。Zodiac成员没有被声明为DataMember,因此在交换数据时,不会传输Zodiac的任何信息。

DataContract也支持Name/Namespace属性,如同ServiceContract,Name和Namespace可以自定义名称和命名空间,客户端将使用自定义的名称和命名空间对DataContract类型进行访问。

声明为DataMember的成员也可以自定义客户端可见的名称,例如:

[DataMember(Name="Name")]

public string UserName

{

get;

set;

}

[DataMember(Name="Age")]

public int UserAge

{

get;

set;

}

除了Name和Namespace以外,DataMember还有以下参数,它们的含义分别如下。

(1)IsRequired:值为true时,要求序列化引擎检查对象是否存在该值;若无,则会有异常抛出。

(2)Order:bool类型值,值为true时,序列化和反序列化过程将会按成员定义的顺序进行,这对依赖于成员位置的反序列化过程无比重要。

(3)EmitDefaultvalue:为成员属性设置一个默认值。

一般情况下,将类型声明为DataContract就可以满足传送的需求了,不过特殊情况是难以避免的,这时就需要对要传送的SOAP消息进行更加精确的控制,MessageContract可以满足这种需求。

把一个类型声明为MessageContract,意味着它可以被序列化为SOAP消息,可以声明类型的成员为SOAP消息的各个部分,如Header、Body等,如下所示。

[MessageContract]

public class UserMessage

{

private string user = String.Empty;

private string authKey = String.Empty;

[MessageBodyMember(

Name = "UserName",

Namespace = "http://www.wcf.com")]

public string User

{

get { return user; }

set { user = value; }

}

[MessageHeader(

Name = "AuthKey",

Namespace = "http://www.wcf.com",

MustUnderstand = true

)]

public string AuthKey

{

get { return authKey; }

set { this.authKey = value; }

}

}

User成员被声明为MessageBody(消息体)的一个成员,AuthKey被声明为消息头(MessageHeader)的一个成员。这个类将可以生成如下的SOAP消息。

<s:Envelope>

<s:Header>

<a:Action s:mustUnderstand="1">http://UserMessage/Action</a:Action>

<h:AuthKey s:mustUnderstand="1" xmlns:h="http://www.wcf.com">xxxx</h:AuthKey>

</s:Header>

<s:Body>

<UserMessage xmlns="Microsoft.WCF.Documentation">

<User xmlns="http://www.wcf.com">abcd</User>

</UserMessage>

</s:Body>

</s:Envelope>

MessageHeader中,MustUnderstand参数表示读取该头的程序必须能够识别头的内容,否则不能继续处理。Name/Namespace的作用与前面的元素相同。另有Relay参数,若为true,头的内容被接收到以后会在响应消息中回发给消息发送端。

例如:

string html="{\"Table\":[{\"IssueNum\":\"20130725023\",\"Result\":\"0 3 7 9 1\",\"AwardTime\":\"2013-07-25 01:55\"},{\"IssueNum\":\"20130725022\",\"Result\":\"0 1 3 8 9\",\"AwardTime\":\"2013-07-25 01:50\"},{\"IssueNum\":\"20130725021\",\"Result\":\"9 4 5 5 0\",\"AwardTime\":\"2013-07-25 01:45\"},{\"IssueNum\":\"20130725020\",\"Result\":\"2 5 6 1 5\",\"AwardTime\":\"2013-07-25 01:40\"},{\"IssueNum\":\"20130725019\",\"Result\":\"1 5 2 6 8\",\"AwardTime\":\"2013-07-25 01:35\"},{\"IssueNum\":\"20130725018\",\"Result\":\"5 3 2 3 9\",\"AwardTime\":\"2013-07-25 01:30\"},{\"IssueNum\":\"20130725017\",\"Result\":\"9 3 6 7 4\",\"AwardTime\":\"2013-07-25 01:25\"},{\"IssueNum\":\"20130725016\",\"Result\":\"5 7 5 2 8\",\"AwardTime\":\"2013-07-25 01:20\"},{\"IssueNum\":\"20130725015\",\"Result\":\"2 7 0 3 9\",\"AwardTime\":\"2013-07-25 01:15\"},{\"IssueNum\":\"20130725014\",\"Result\":\"4 5 2 0 6\",\"AwardTime\":\"2013-07-25 01:10\"},{\"IssueNum\":\"20130725013\",\"Result\":\"8 7 7 5 7\",\"AwardTime\":\"2013-07-25 01:05\"},{\"IssueNum\":\"20130725012\",\"Result\":\"2 4 2 6 5\",\"AwardTime\":\"2013-07-25 01:00\"},{\"IssueNum\":\"20130725011\",\"Result\":\"9 6 4 8 8\",\"AwardTime\":\"2013-07-25 00:55\"},{\"IssueNum\":\"20130725010\",\"Result\":\"5 3 3 4 5\",\"AwardTime\":\"2013-07-25 00:50\"},{\"IssueNum\":\"20130725009\",\"Result\":\"3 8 3 1 3\",\"AwardTime\":\"2013-07-25 00:45\"},{\"IssueNum\":\"20130725008\",\"Result\":\"5 6 8 7 8\",\"AwardTime\":\"2013-07-25 00:40\"},{\"IssueNum\":\"20130725007\",\"Result\":\"8 1 3 7 9\",\"AwardTime\":\"2013-07-25 00:35\"},{\"IssueNum\":\"20130725006\",\"Result\":\"6 2 4 8 4\",\"AwardTime\":\"2013-07-25 00:30\"},{\"IssueNum\":\"20130725005\",\"Result\":\"3 4 3 9 5\",\"AwardTime\":\"2013-07-25 00:25\"},{\"IssueNum\":\"20130725004\",\"Result\":\"8 5 5 8 0\",\"AwardTime\":\"2013-07-25 00:20\"},{\"IssueNum\":\"20130725003\",\"Result\":\"9 4 4 2 9\",\"AwardTime\":\"2013-07-25 00:15\"},{\"IssueNum\":\"20130725002\",\"Result\":\"3 6 1 2 0\",\"AwardTime\":\"2013-07-25 00:10\"},{\"IssueNum\":\"20130725001\",\"Res
ult\":\"5 6 0 2 4\",\"AwardTime\":\"2013-07-25 00:05\"}]}"

//
 public static string GetJson(string html)
 {
            SSCSerialize ssc = new SSCSerialize(); //实体类名
            var json = ConvertJson(html,ssc.GetType()); // 解析JSON
            return json.ToString();
 }

//解析JSON
private static object ConvertJson(string json,Type t)
 {
            try
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(t);
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
                {
                    return serializer.ReadObject(ms);
                    
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
}

//实体类
[DataContract]
 public class SSCSerialize
{
        [DataMember]
        public string IssueNum { get; set; }
        [DataMember]
        public string Result { get; set; }
        [DataMember]
        public string AwardTime { get; set; }
 }

解析出来是FromData.IEnumerable.SSCSerialize类名.

数据契约(DataContract)的作用的更多相关文章

  1. C# Attribute(特性)之---数据契约 [DataContract]

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

  2. 数据契约[DataContract]

    数据契约(DataContract)服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型.一旦声明一个类型为DataContract,那么该类型就可以被序列 ...

  3. WCF之数据契约

    从抽象层面看,WCF能够托管CLR类型(接口和类)并将它们公开为服务,也能够以本地CLR接口和类的方式使用服务.然而,CLR类型却属于.NET的特定技术.由于面向服务的一个核心原则就是在跨越服务边界时 ...

  4. 数据契约(DataContract)

    原文地址:http://www.cnblogs.com/Gavinzhao/archive/2010/06/01/1748736.html 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务 ...

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

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

  6. WCF中的数据契约(DataContract)

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

  7. WCF 数据契约(DataContract)

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

  8. 数据契约(DataContract)及序列化指定输出字段

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

  9. 数据契约(DataContract)里的DataMember特性

      数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可 ...

随机推荐

  1. 在java中使用dom4j包对String格式的xm数据l解析

    在网上找了好久,都没搞出来,借鉴别人的代码,依葫芦画瓢,写了个自己用的解析类.注意节点属性和子节点的区别就好了,这个包的方法还挺好用的 package com.allinpay.utils; impo ...

  2. 【hihoCoder 第133周】2-SAT·hihoCoder音乐节

    http://hihocoder.com/contest/hiho133/problem/1 2-sat模板...详细的题解请看题目里的提示. tarjan模板打错again致命伤qwq #inclu ...

  3. 读写锁的实现原理(pthread_rwlock_t)

    引言 不同的锁之间的语义是不一样的,没有一劳永逸的锁,只有更适合的锁. 如果是同一进程里的不同线程共享读写锁,那么读写锁变量的维护是在进程内部即可.如果是不同进程共享读写锁,那么读写锁变量的维护是在共 ...

  4. tinkphp5.0 traits 的引入

    Traits引入 ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题. trait是一种为类似 PHP 的单继承语言而准备的代码复用 ...

  5. django 中文乱码问题

    在使用JS 发送ajax到django后台的时候,可能会出现中文乱码问题 解决方案: 所有的HTMl 和py文件都使用utf-8编码,在创建数据库的时候指定使用utf8 :create databas ...

  6. web容器启动顺序

    web容器启动顺序: 第一:context-param 第二:Listerer 第三:Filter 第四:servlet

  7. php中__clone() shallow copy 只是浅复制

    什么是浅复制呢? 简单一点,就是说复制一个对象的时候,如果对象$Obj的一个属性的类型是引用类型的,比如 $person这个属性,指向的是一个 叫做 $objPerson的一个引用, 那么复制$Obj ...

  8. iOS开发——modifying the autolayout engine from a background thread

    很多时候,我们需要用到多线程的东西,比如红外线检测是否有人经过.这种情况需要搞个子线程在后台不断的检测,这个线程可能是第三方提供的,你调用它给的方法,然后显示提示框的时候,问题就来了. 提示信息:Th ...

  9. Delphi 数据类型的说明

    简单类型包括实数类型(Real) 和有序类型(Ordinal),有序类型又包括整数类型,字符类型,布尔类型,枚举类型和子界类型等. 数据类型                       范围      ...

  10. Java的内存泄漏

    内存泄漏是指,无用对象(不再使用的对象)持续占用内存或者无用对象的内存得不到及时释放,从而造成的内存浪费 就说是有一块内存你不需要再用了,但是呢你还保留着它的指针,那么这块内存就不会被回收 举个例子 ...