不同命名空间的对象二进制反序列化问题
本质上说,这并不是二进制序列化的问题,甚至不关序列化的问题。
你想要的是在两个内部结构一致但在不同命名空间(甚至不同项目)的同名类间做类型转换。
这个问题很常见,因为实际工作中经常会有此类需求,但是我们又不可能手动的把每个字段的值都抄来抄去。
解决此问题的方法很多,但都逃不开一个关键思想:A不知道B的存在,B不知道A的存在,那么我就找出一个C,只要A和B都能以C的形式表示,那么转换就不是问题。这里的C是概念上的一个标准,用于当做A和B转换的桥梁。
普遍的解决方法:
如一楼所说,XmlSerializer序列化器能够将一个可Xml序列化的类A的“内容”部分抽取出来序列化成Xml片段,也能够将其反序列化为一个符合该Xml“格式”的类B。代码如下。
序列化端:
1
2
3
4
5
6
7
8
|
System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer( typeof (classA));
System.IO.Stream stream = new System.IO.FileStream( @"c:\tmp.txt" ,System.IO.FileMode.OpenOrCreate);
xs.Serialize(stream, new classA { i = 10, s = "hello" });
stream.Dispose();
反序列化端:
System.Xml.Serialization.XmlSerializer xsb = new System.Xml.Serialization.XmlSerializer( typeof (classA));
classA b = (classA)xsb.Deserialize( new System.IO.FileStream( @"c:\tmp.txt" , System.IO.FileMode.Open, System.IO.FileAccess.Read));
|
打开c:\tmp.txt,我们可以看到中间传输的内容是
1
2
3
4
5
|
<?xml version= "1.0" ?>
<classA xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" >
<i>10</i>
<s>hello</s>
</classA>
|
这表明了传输的内容只关注类名和共有属性/字段。所以在反序列化端,只要我们有同样结构的同名类classA,是可以直接从Xml流进行转换的。当然使用内存流、字节流等都是可以的。这里一定要切记三点:同名同结构(指共有字段/属性部分)的两个类,以及只能序列化公有字段和属性,两个类都必须有默认构造方法。
Xml序列化的优点在于只序列化必要部分且消耗较少,常用于序列化DataTable等结构。
2.第二种方法是使用接口。也许你的两个类分处不同的命名空间或者不同项目,但是只要都能访问到同一interface,那么我们可以稍微费点功夫写一个两个都“认识”的接口,通过接口来转换对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public interface dataInterface
{
int i{ get ; set ;}
string s{ get ; set ;}
}
[Serializable]
public class classA : dataInterface
{
public int i{ get ; set ;}
public string s{ get ; set ;}
}
[Serializable]
public class classB : dataInterface
{
public int i{ get ; set }
public string s{ get ; set ;}
}
|
如此,不管classA和classB在哪里,只要你认得dataInterface,那么就可以用其来传输、访问和转换。传输的过程相比xml序列化就灵活多了,你可以使用socket、文件、消息、甚至共享内存等等手段来传输,序列化也可以使用万能的二进制序列化,因为你传出和接受的,都是dataInterface对象而已。
序列化端(二进制序列化+文件传输举例):
1
2
3
4
|
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.FileStream fs = new System.IO.FileStream( @"c:\tmp" , System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
formatter.Serialize(fs, ( new classA { i = 10, s = "hello" }));
fs.Dispose();
|
反序列化:
1
|
dataInterface data = (dataInterface)formatter.Deserialize( new System.IO.FileStream( @"c:\tmp" , System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read));
|
此方法优缺点显而易见。优点是无视两个类的位置、无需同名同结构,缺点是有额外工作(写接口)外加反序列化后只能得到接口不能得到classB。额外注意,上例中使用的二进制序列化需要在类上标记[Serializable]。
除此之外还有很多种方法可以做跨域类型转换,但并不常用,这里就不再敖述了。
转载于:https://www.cnblogs.com/yy1234/p/8405556.html
不同命名空间的对象二进制反序列化问题相关推荐
- C#中使用SharpZipLib进行解压缩然后进行二进制反序列化
场景 C#中将list进行序列化并使用SharpZipLib进行压缩: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/999400 ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- 对象的反序列化流_ObjectInputStream
package com.learn.demo04.ObjectStream;import java.io.FileInputStream; import java.io.IOException; im ...
- 命名空间_python基础 13 类命名空间于对象、实例的命名空间,组合方法
python基础 13 类命名空间于对象.实例的命名空间,组合方法 1.类命名空间于对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两 ...
- python中关于命名的例子_Python()-类命名空间和对象/实例命名空间
类命名空间和对象/实例命名空间: 创建类, 就会创建一个类的名称空间, 空间:存储类的属性 属性: 静态属性:直接定义在类下面 & 和类名关联 的变量 对象属性:在类内和self关联 & ...
- 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化
二进制序列化可以方便快捷的将对象进行持久化或者网络传输,并且体积小.性能高,应用面甚至还要高于json的序列化:开始之前,先来看看dotcore/dotne自带的二进制序列化:C#中对象序列化和反序列 ...
- csv反序列化_对象的反序列化
用python实现接口测试(八.实现序列化与反序列化) 前言 在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为py ...
- php反序列化需要几个对象,PHP反序列化详解
PHP反序列化漏洞(PHP对象注入漏洞) PHP中有两个函数serialize()[用于序列化]和unserialize()[用于反序列化] 这里一个使用了serialize函数序列化数值的例子 cl ...
- Java19-day10【标准输入输出流、字节字符打印流、对象序列化-反序列化流、serialVersionUIDtransient、Properties】
视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...
最新文章
- java protobuffer 网络_使用Protobuf定义网络协议
- Face Recognition for the Happy House-v3
- pyqt5教程11:绘制外观
- 基于NEO的私链(Private Blockchain)
- xampp mysql 查询很慢_如何开启mysql的慢查询机制
- Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源
- 看我出招之:svchost.exe文件删不得
- uniapp中自定义导航栏动态获取高度
- 【全干货】5分钟带你看懂 Docker!
- HDU 6168 Numbers 思维 水题
- maya为什么不能导出fbx_Maya在操作中最容易出现的几个问题,现在注意还来得及...
- java ssh环境 eclipse_SSH在eclipse中环境搭建
- Python3按编号创建文件夹并在文件夹下创建对应编号的txt文件
- Cinesamples CineOrch for Mac(电影管弦乐队音色库)v2.0特别版
- 技术问题解答-AOP原理
- linux上chrome、vlc等程序root不能运行的解决办法
- python编程多少钱_中山python编程课学习大概多少钱
- 的唯一性_原神:被氪金玩家淹没的角色,输出很高,技能具有唯一性
- 瑞克和莫蒂 第三季6集
- 谈的话马上得到了聚众传媒创始人虞峰、博客中国创始人方兴东及携程网创始人之一的季琦等三位嘉宾的一致响应
热门文章
- 股票移动平均线matlab,股票的移动平均线 (图文)
- html标记汇总,HTML标记语法汇总.doc
- 置顶带滚动效果_高端大气的滚动条图表,你学会了还怕老板们不喜欢,不升职吗?...
- php pdo 时间,php – 使用PDO执行时间记录查询 – 自动完成功能无效
- nginx php 大小写问题,Nginx实现url请求不区分大小写
- java中如何把时间封装成类,java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象?...
- 习题8_6与习题9_2
- 空标签作为占位符调整距离
- 点、线、面生成mvt(MapBox Vector Tile)格式的瓦片总结
- 概率论与数理统计--样本及抽样分布