• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

关于C#序列化结果的长度获取

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

    关于C#序列化的文章真的是好多,但是内容大致一样,主要分四类:

  1. BinarySerialize
  2. SoapSerialize
  3. XmlSerialize
  4. JSON.Net和DataContractJsonSerializer

    最近的一个项目需要使用Socket进行通信,所以必然涉及序列化的问题。使用BinarySerialize序列化之后发现无论如何获取不了序列化后的实际长度,代码如下

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Serialize
{
    public class BinarySerialize
    {
        byte[] buffer=new byte[1024];

        public void Serialize(Book book)
        {
            using (MemoryStream fs = new MemoryStream(buffer, 0,1024))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, book);
            }
        }

        public Book DeSerialize()
        {
            Book book;
            using (MemoryStream fs = new MemoryStream(buffer,0,1024))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                book = (Book)formatter.Deserialize(fs);
            }
            return book;
        }
    }
}

    通过MemoryStream获取长度,永远是1024。后来试了好久发现其实只需要改一点点地方就可以了,改正后的代码如下,顺便做了点通用性扩展:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;


namespace Serialize
{
    public class MemoryBinarySerialize
    {
        
        public static byte[] Serialize(object obj)
        {
            MemoryStream fs = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(fs, obj);
            return fs.GetBuffer();
        }
        
        public static object DeSerialize(byte[] data)
        {
            MemoryStream fs = new MemoryStream(data);
            BinaryFormatter formatter = new BinaryFormatter();
            object obj= formatter.Deserialize(fs);
            return obj;
        }
    }
}

    参考文献:

    C#序列化技术详解(转):http://www.cnblogs.com/ejiyuan/archive/2009/01/21/1379256.html

    序列化和反序列化(Socket中传递Object):http://dev.firnow.com/course/4_webprogram/asp.net/netjs/20081011/150063.html

    C#中JSON的序列化和反序列化:http://www.dotnetdev.cn/2010/01/c%E4%B8%AD%E7%9A%84json%E7%9A%84%E5%BA%8F%E5%88%97%E5%8C%96%E5%92%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
.NetC#域账号登陆验证发布时间:2022-07-18
下一篇:
ORA-01000:超出打开游标的最大数(C#)发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap