c#中Model对象进行序列化和反序列化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本在写webservices接口是遇到了问题 花了很长时间才找到这个陌生的解决办法 (将对象进行序列化和反序列化)
在C#中可以将任何类型进行序列化
我做的实战项目如下
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
原本在WEBservicess接口中调用的方法如下:
///
/// 得到一个对象实体
///
[WebMethod]
public er_group_price GetModel_price(string goods_id, string group_id)
{
return dal.GetModel(goods_id, group_id);
}
发现在调用接口时,写法如下:
///
/// 根据规格列表查询商品实体
///
public Model.article_goods GetModel_info(int goods_id, string group_id)
{
string[] args = new string[2];
args[0] = article_id.ToString();
args[1] = spec_ids;
object result = DTcms.DBUtility.WebServiceHelper.InvokeWebService(url, "GetModel_price", args);
Model.article_goods model = (Model.article_goods)result;
return model;
}
此时返回出的结果就会错误,
为什么? 原因很简单,在接口出返回的是一个Model实体对象,接收Model是一个Object对象,然后将Object对象进行类型转换为 Model对象就会出问题
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
此时想到了一个解决办法,利用序列化和反序列化,将Model对象进行转换为string类型进行输出,在调用接口处进行转化即可实现
首先在WEBservices接口调用处这样写:
///
/// 得到一个对象实体
///
[WebMethod]
public string GetModel_price(string goods_id, string group_id)
{
er_group_price bll = new er_group_price();
er_group_price model = bll.GetModel(Convert.ToInt32(goods_id), Convert.ToInt32(group_id));
byte[] b = Serializable_Data(model);
string strRec = Serializable_Data(b);
if (strRec == null)
{
return null;
}
else
{
return strRec;
}
}
注意:一下代码一定要加在WEBservices接口中 ,这是实现序列化的方法(与接口并存)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#region=================将Model类型进行序列化和反序列化======================
public byte[] Serializable_Data(Object obj)
{
if (obj == null)
{
return null;
}
else
{
IFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] b;
formatter.Serialize(ms, obj);
ms.Position = 0;
b = new byte[ms.Length];
ms.Read(b, 0, b.Length);
ms.Close();
return b;
}
}
/// 将字节数组转为ASCII字符
public string Serializable_Data(byte[] _data)
{
if (_data==null)
{
return null;
}
else
{
return Convert.ToBase64String(_data);
}
}
#endregion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在调用接口方法中如下:
///
/// 根据规格列表查询商品实体
///
public Model.article_goods GetModel_info(int article_id, string spec_ids)
{
string[] args = new string[2];
args[0] = article_id.ToString();
args[1] = spec_ids;
object result = DTcms.DBUtility.WebServiceHelper.InvokeWebService(url, "GetModel_info", args);
if (result == null)
{
return null;
}
else
{
Model.article_goods model = (Model.article_goods)Deserialize_Data(result.ToString());
return model;
}
}
$$$$$$$$$$$$$$$$$$$$$$$此方法就是进行反序列化的方法$$$$$$$$$$$$$$$$$$$$$$$
///
/// 反序列化 字符串到对象
///
/// 泛型对象
/// 要转换为对象的字符串
///
public static object Deserialize_Data(string str)
{
object obj;
try
{
IFormatter formatter = new BinaryFormatter();
byte[] buffer = Convert.FromBase64String(str);
MemoryStream stream = new MemoryStream(buffer);
obj = formatter.Deserialize(stream);
stream.Flush();
stream.Close();
}
catch (Exception ex)
{
throw new Exception("反序列化失败,原因:" + ex.Message);
}
return obj;
}
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
以上序列化与反序列化 是自己 总结出来的 希望对大家有帮助 记住 在使用序列化和反序列化时,要注意一点,当调用接口是查询接口为NULL ,要是不做判断 就会提示类型错误...