翻看MSDN,关于对象序列化的示例最常见的都是在文件流中进行XML序列化,因为开发的需要,我必须要在内在流中将对象以二进制方式序列化,原以为很简单,copy一下示例改改就好了,原代码如下:

public sealed class Serializer
{
    private Serializer() { }

    public static string SerializeObject(object obj)
    {            
        IFormatter formatter = new BinaryFormatter(); 
        string result = string.Empty;
        using (MemoryStream stream = new MemoryStream())
        {
            formatter.Serialize(stream, obj);

            byte[] byt = new byte[stream.Length];
            byt = stream.ToArray();
            result = Encoding.UTF8.GetString(byt, 0, byt.Length);
           
            stream.Flush();                
        }
        return result;
    }

    public static object DeserializeObject(string str)
    {         
        IFormatter formatter = new BinaryFormatter();
        byte[] byt = Encoding.UTF8.GetBytes(str);
     
        object obj = null;
        using (Stream stream = new MemoryStream(byt, 0, byt.Length))
        {
            obj = formatter.Deserialize(stream);
        }
        return obj;
    }
}

谁想到在单元测试的时候却是报忧不报喜啊,错误信息是这样:SerializerTest.SerializeObjectTest 引发异常:

System.Runtime.Serialization.SerializationException: 二进制流“0”不包含有效的BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。

经过debug,发现SerializeObject方法中,"result = Encoding.UTF8.GetString(byt, 0, byt.Length);"此行代码运行过后,result的值居然是"\0\0\0……"一大串开头,难怪会报错的。
        此后我只是将BinaryFormatter换成XMlSerializer其他的不变,那倒是能正常得到结果的,可那不是我想要的啊,总是问题之关键在于将byte数组转为string时的字符串,所以接下来我先后用gb2312,ansi,unicode等Encoding来转换均无果,后来在Convert类中找到一个方法,修改后的代码如下:

public sealed class Serializer
{
    private Serializer() { }

    public static string SerializeObject(object obj)
    {
        IFormatter formatter = new BinaryFormatter(); 
        string result = string.Empty;
        using (MemoryStream stream = new MemoryStream())
        {
            formatter.Serialize(stream, obj);

            byte[] byt = new byte[stream.Length];
            byt = stream.ToArray();               
            //result = Encoding.UTF8.GetString(byt, 0, byt.Length);
            result = Convert.ToBase64String(byt);
            stream.Flush();                
        }
        return result;
    }

    public static object DeserializeObject(string str)
    {
        IFormatter formatter = new BinaryFormatter();
        //byte[] byt = Encoding.UTF8.GetBytes(str);
        byte[] byt = Convert.FromBase64String(str);
        object obj = null;
        using (Stream stream = new MemoryStream(byt, 0, byt.Length))
        {
            obj = formatter.Deserialize(stream);
        }
        return obj;
    }
}

再次单元测试通过了,说明修改有效,回头debug到“result = Convert.ToBase64String(byt);”,result的值开头没有"\0"了,都是字母,这才证明了序列化成功的原因。之后对基于64位的字符串转换应该多加关注,往往能起到令人惊喜的效果,本案总算是结案了。

转载于:https://www.cnblogs.com/BeanHsiang/archive/2007/09/21/901866.html

在内存流中对象的二进制序列化的问题相关推荐

  1. IO流 (五) ----- 对象数据的序列化与反序列化

    相关文章: <IO流 (一) ----- 基本概念和File类> <IO流 (二) ----- 文件流> <IO流 (三) ----- 字符流和字符缓冲流> < ...

  2. SDL 从内存流中加载图像并显示

    最近做项目需要实现这么一个功能,需要将Android平板上显示的内容实时传送到投影仪上显示. 连接投影仪的机器安装了 CentOS 6,采用 SDL 开发库做 UI 界面.系统本来的需求只要在投影仪上 ...

  3. C#中数据流(文件流、内存流、网络流等)相关知识点梳理

    基本概念 C#中数据流的应用体现在方方面面,现在针其常用的几种类进行一次梳理. 数据流包括文件流(FileStream).内存流(MemoryStream).网络流(NetworkStream)以及读 ...

  4. C# 对象转Json序列化

    JSON Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式.这使得Json成为理想的数据交换语 ...

  5. 深入认识二进制序列化--记一次生产事故的思考

    来自:特来电云计算与大数据 一 概要 二进制序列化是公司内部自研微服务框架的主要的数据传输处理方式,但是普通的开发人员对于二进制的学习和了解并不深入,容易导致使用过程中出现了问题却没有分析解决的思路. ...

  6. [转载]C# MemoryStream(内存流)

    MemoryStream位于System.IO命名空间,为系统内存提供流式的读写操作.常作为其他流数据交换时的中间对象操作. 1.MemoryStream类封装一个字节数组,在构造实例时可以使用一个字 ...

  7. C#内存流示例-----gt;用内存流来读取图片

    C#文件处理操作必须先导入命名空间:using System.IO; 背景:一个窗体.一个pictureBox.一个lable[没有选择图片,lable的text为"图片未选择"] ...

  8. 传递实体类对象_Java I/O 流之对象流中的序列化和反序列化

    一.概念 当两个进程远程通信时,彼此可以发送各种类型的数据. 无论是何种类型的数据,都会以二进制序列的形式在网络上传送.比如,我们可以通过 http 协议发送字符串信息:我们也可以在网络上直接发送 J ...

  9. java 网络传输中发送byte[]和接收到的不一致_为什么JAVA对象需要实现序列化?

    序列化是一种用来处理对象流的机制.所谓对象流:就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题.序列化的 ...

最新文章

  1. SLAM的开源以及在移动端AR的适用分析
  2. jupyter添加标题、文字注释
  3. 了解java虚拟机—垃圾回收算法(5)
  4. 深度学习100例-生成对抗网络(DCGAN)生成动漫人物 | 第20天
  5. android listView的setOnScrollListener的使用
  6. openshift_云上的播放框架变得简单:Openshift模块
  7. matlab文件序号超出511,求教一段matlab的代码 - 数学 - 小木虫 - 学术 科研 互动社区...
  8. springboot系列(十)springboot整合shiro实现登录认证
  9. Centos系统使用代理上网时 yum的代理设置
  10. Python批量生成垃圾邮件内容
  11. 马云行业预测:人工智能下,未来10年机器人占领职场
  12. java书籍_2020年java从入门到进阶书籍推荐,基础\自学\编程\数据结构\后端\虚拟机\网络\设计模式书籍...
  13. SQL语句关于数据库安全性
  14. html网页的配色,css页面网页配色
  15. 使用Graphics画表格
  16. 基于python爬虫的加盟品牌数据挖掘研究与实现_基于Python 语言的Web 数据挖掘与分析研究...
  17. Qt,Linux: 播放声音(aplay)
  18. .styl格式的CSS样式文件是什么文件
  19. 无法直接打开jar文件,提示“你要以何种方式打开.jar文件”(已解决)
  20. rgb转换 css 字体

热门文章

  1. 云存储之对象存储性价比小谈
  2. python 深浅拷贝案例_python(深浅拷贝)
  3. python决策树分类 导入数据集_BPNN、决策树、KNN、SVM分类鸢尾花数据集Python实现...
  4. html text align属性,CSS中的text-align属性怎么用
  5. 骑马与砍杀是用python编的_骑马与砍杀编辑模式怎么用
  6. 萌新的Python练习实例100例(六)斐波那契数列
  7. 5 | Spatial-based GNN/convolution模型之DGC
  8. 强化学习:2 马尔科夫决策过程
  9. linux安装nvidia驱动+cuda10.0+cudnn7.4.2
  10. 去中心化加密指数协议DeHive即将4月14日启动公募