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

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

只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。

默认情况下,所有公共属性和字段都包含在序列化的JSON中。要省略属性或字段,请使用JsonIgnore属性进行装饰。

public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
[JsonIgnore]
public int ProductCode { get; set; } // omitted
}

如果您更喜欢“选择加入(opt-in)”方法,请使用DataContract属性修饰类。如果存在此属性,则忽略成员,除非它们具有DataMember。您还可以使用DataMember序列化私有成员。

[DataContract]
public class Product
{
[DataMember]
public string Name { get; set; }
[DataMember]
public decimal Price { get; set; }
public int ProductCode { get; set; } // omitted by default
}

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

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

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

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

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

总结:

不加的话,默认所有public的属性都要序列化。

但是加的话,只有标注的属性(或字段)才能序列化,而且即使那个属性是私有的,一样可以序列化,不受任何限制。

使用DataContractJsonSerializer进行Json的序列化和反序列化

引用(Using):

using System.IO;
using System.Runtime.Serialization.Json;

序列化与反序列化:

/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
} /// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}

最新文章

  1. webrtc初识
  2. 网站微信登录授权 ASP.NET
  3. ASP.NET MVC5 网站开发实践(一) - 项目框架(转)
  4. 写给java程序员的c++与java实现的一些重要细微差别
  5. flex 调用gp服务
  6. ODI中web service介绍
  7. Windows Phone零距离开发(Composite Thread组合线程)
  8. CENTOS YUM软件源
  9. Class&lt;Object&gt;与Class&lt;?&gt;有何区别呢
  10. eclipse安装ermaster建模插件
  11. 学习Swift -- 析构过程
  12. VB.NET 结构(Structure)和类(Class)的区别
  13. day10 函数的定义及函数语法详解
  14. 【ES6】export和important使用区别
  15. 数据库 -- mysql记录操作
  16. 在cmd启动一个win32程序,printf把信息输出到启运它的那个CMD窗口
  17. html5 + vue
  18. c++中的类(class)-----笔记(类多态)
  19. 基础邮件原理(MUA,MTA,MDA)
  20. (一)ROS的安装与环境配置

热门文章

  1. win7 ARP 命令运行失败解决办法
  2. ANDROID颜色设置
  3. 在进程中执行新代码 execl、execle、execlp、execv、execve和execvp函数
  4. hibernate 关于session的update方法
  5. SSH限制ip登陆
  6. oblique perspective projection
  7. 学习笔记:iOS 视图控制器(UIViewController)剖析
  8. eclipse java MemoryAnalyzer 查询内存泄漏 环境配置
  9. CvSplit
  10. 利用jquery的contains实现搜索功能