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

    关于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/

转载于:https://www.cnblogs.com/sdqxcxh/archive/2011/01/19/1939101.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团队项目-需求分析

团队作业-需求分析 这个作业属于哪个课程https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2这个作业的要求在哪里https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3105团队名称快乐小分队这个作业的目标完成英语学习app,尽量…

REMarkerClusterer

2019独角兽企业重金招聘Python工程师标准>>> REMarkerClusterer 创建和管理大量的标记每个缩放级别的集群。REMarkerClusterer 受苹果的照片应用程序在iPhone上的启发,模仿它的行为提供分组和取消分组集群的动画。 转载:http://www.adobex.com/ios/sourc…

mysql 8.0 一条insert语句的具体执行流程分析(三)

代码版本:mysql 8.0.22 编程语言:c && c11 && c14 && c17 上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(二)_一缕阳光的博客-CSDN博客 主要介绍了存储引擎部分,这个章节主要介绍insert一条…

corosync+openais+pacemaker+web

corosync 和openais 各自都能实现群集功能,但是功能比较简单,要想实现功能齐全、复杂的群集,需要将两者结合起来.corosync 和openais 各自都能实现群集功能,但是功能比较简单,要想实现功能齐全、复杂的群集&#xff0c…

Asp.net MVC 3实例学习之ExtShop(五)——产品详细页

在产品详细页需要使用到tab控件,在jquery的ui包已包含改控件,因而将相应文件链接加到母版页就可以了。 打开“ProductController”文件,在里面添加一个Details操作,代码如下: 1 public ActionResu…

解构领域驱动设计(三):领域驱动设计

在上一部分,分层架构的目的是为了将业务规则剥离出来在单独的领域层中进行实现。再回顾一下领域驱动设计的分层中应用层代码的实现。 Override public void pay(int orderId, float amount) {DesignerOrder order designerOrderRepository.selectByKey(orderId); …

MySQL中update一条record的过程

在MySQL中,update是原地更新数据,原地更新数据,原地更新数据。重要的事情说3遍。这是不同于PGSQL的。 update的具体过程是: (1)、先对该条record对应的索引加X锁 (2)、将修改后的数据写入到redo.log中 (3)、将修改之前的数据备…

[AX]AX2012 AIF(二):文档服务编程模型

一个完整的文档服务包含很多对象,以Customer服务为例,它包含以下对象: 查询AxdCustomer:这个query的顶层表为CustTable,其下Datasource包含表DirParty,DirParty下的Datasource则再包含表DirPersonName、表D…

安装sql server 2000时,提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作,需重起...

打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目。 方法二: 1、添加/删除程序中彻底删除sql server。 2、将没有删除…

iOS 打包.framework(包括第三方、图片、xib、plist文件)详细步骤及需要注意的地方...

https://www.cnblogs.com/yk123/p/9340268.html // 加载自定义名称为Resources.bundle中对应images文件夹中的图片// 思路:从mainbundle中获取resources.bundleNSString *strResourcesBundle [[NSBundle mainBundle] pathForResource:”Resources” ofType:”bundle”];// 找到…

MySQL中innodb_page_cleaners详解

innodb_page_cleaners是MySQL中的刷脏线程个数,它的值等于innodb_buffer_pool_instances的值,如果innodb_page_cleaners的值大于innodb_buffer_pool_instances的值,那么自动的将innodb_page_cleaners调整为与innodb_buffer_pool_instances的值…

uiimagepickerviewcontroller

if(0buttonIndex) { if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { UIAlertView *alert [[UIAlertView alloc] initWithTitle:"" message:"当前设备不支持拍照功能" delegate:nil cancelButtonTitl…

关于CString的=操作符

检查自已的代码时,发现一个比较弱智的错误,是关于转码的,和CString的操作符有关。 为了能简单重现,我模拟了一下代码: //未有UNICODE或_UNICODE定义 USES_CONVERSION; CString sTest(_T("test中文")); s…

分布式锁的几种使用方式(redis、zookeeper、数据库)

三种方案的比较 从理解的难易程度角度(从低到高) 数据库 > 缓存 > Zookeeper从实现的复杂性角度(从低到高) Zookeeper > 缓存 > 数据库从性能角度(从高到低) 缓存 > Zookeeper > 数据库从…

SQL优化准则

1. 在长时间运行的查询和短查询中使用事务 如果预期有一个长时间运行的查询,并且有大量的数据输出时,开发者就应该在BEGIN TRAN 和END TRAN之间使用事务。 这样事务会在缓冲区缓存为独立事务,并会被分配特定内存,以此来提高处理…

C语言库函数--strstr()

原型&#xff1a;extern char *strstr(const char *str1, const char *str2); 需要包含的头文件&#xff1a;#include <string.h> 作用&#xff1a;用于判断字符串str2在字符串str1中第一次出现的位置。如果没有找到则返回NULL&#xff0c;找到了则返回str1中的位置。 …

《离散数学》双语专业词汇表 名词术语中英文索引

《离散数学》双语专业词汇表 set&#xff1a;集合 subset&#xff1a;子集 element, member&#xff1a;成员&#xff0c;元素 well-defined&#xff1a; 良定&#xff0c;完全确定 brace&#xff1a;花括号 representation&#xff1a;表示 sensible&#xff1a; 有意义的 rat…

less is more,so 只记 less

less 文件名 1.Enter键  &#xff1a;向下翻一行 2.空格键   &#xff1a;向下翻一屏 3.j键    &#xff1a;想下翻一行 4.k键    &#xff1a;向上翻一行 5.f键    &#xff1a;向下翻一屏 6.b键     &#xff1a; 向上翻一屏 7.d键    &#xff1a;向…

预祝大家2011农历新年快乐,宏“兔”大展,心想事成~

预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; 又是一年新年到&#xff0c;预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; _____________________________________________________ 以下是附带的……

MySQL中的表压缩功能

MySQL版本&#xff1a;8.0.22 os&#xff1a;linux ubuntu 语言&#xff1a;c、c 在MySQL中支持3种类型的表压缩&#xff0c;依次为&#xff1a;传统压缩、TPC压缩、字典压缩。 第一种&#xff1a;传统压缩 传统的表压缩方式是在MySQL5.0.7之前使用的&#xff0c;现在已经废…