DataContract 和 DataMember
2024-08-27 19:28:37
数据契约(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;
}
最新文章
- webrtc初识
- 网站微信登录授权 ASP.NET
- ASP.NET MVC5 网站开发实践(一) - 项目框架(转)
- 写给java程序员的c++与java实现的一些重要细微差别
- flex 调用gp服务
- ODI中web service介绍
- Windows Phone零距离开发(Composite Thread组合线程)
- CENTOS YUM软件源
- Class<;Object>;与Class<;?>;有何区别呢
- eclipse安装ermaster建模插件
- 学习Swift -- 析构过程
- VB.NET 结构(Structure)和类(Class)的区别
- day10 函数的定义及函数语法详解
- 【ES6】export和important使用区别
- 数据库 -- mysql记录操作
- 在cmd启动一个win32程序,printf把信息输出到启运它的那个CMD窗口
- html5 + vue
- c++中的类(class)-----笔记(类多态)
- 基础邮件原理(MUA,MTA,MDA)
- (一)ROS的安装与环境配置