.NET Core中利用MemoryStream和BinaryFormatter可以实现对象到字节数组的序列化和反序列化:

定义ObjectSerializer类,实现对象到字节数组的序列化和反序列化

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;namespace Assembly
{public static class ObjectSerializer{/// <summary> /// 将一个object对象序列化,返回一个byte[]         /// </summary> /// <param name="obj">能序列化的对象</param>         /// <returns></returns> public static byte[] ObjectToBytes(object obj){using (MemoryStream ms = new MemoryStream()){IFormatter formatter = new BinaryFormatter();formatter.Serialize(ms, obj);return ms.GetBuffer();}}/// <summary> /// 将一个序列化后的byte[]数组还原         /// </summary>/// <param name="Bytes"></param>         /// <returns></returns> public static object BytesToObject(byte[] Bytes){using (MemoryStream ms = new MemoryStream(Bytes)){IFormatter formatter = new BinaryFormatter();return formatter.Deserialize(ms);}}}
}

用BinaryFormatter做序列化和反序列化最大的一个问题是,序列化和反序列化的类型必须是标记为[Serializable]的,也就是SerializableAttribute特性,而且SerializableAttribute特性是无法被继承的,例如我们如果有个类People标记了[Serializable],如下所示:

using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApp2
{[Serializable]public class People{public string Name{get;set;}public int Age{get;set;}}
}

由于People类标记了[Serializable],所以它可以被BinaryFormatter序列化和反序列化,但是假如现在还有个类Child继承People,Child类没有被标记为[Serializable],那么Child类是无法被BinaryFormatter序列化和反序列化的,因为如上所述SerializableAttribute特性是无法被继承的。

Child类如下所示:

using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApp2
{public class Child : People{}
}

建立.NET Core控制台项目,在Main方法中运行如下代码:

class Program
{static void Main(string[] args){var people = new People(){Name = "王大锤",Age = 30};var data = ObjectSerializer.ObjectToBytes(people);people = ObjectSerializer.BytesToObject(data) as People;Console.WriteLine("Press any key to end...");Console.ReadKey();}
}

可以看到People类可以被成功序列化和反序列化

将Main方法的代码改为如下,再运行:

class Program
{static void Main(string[] args){var child = new Child(){Name = "王大锤",Age = 30};var data = ObjectSerializer.ObjectToBytes(child);child = ObjectSerializer.BytesToObject(data) as Child;Console.WriteLine("Press any key to end...");Console.ReadKey();}
}

可以看到代码在ObjectSerializer类的ObjectToBytes方法中抛出了异常,异常提示Child类没有被标记位[Serializable]

转载于:https://www.cnblogs.com/OpenCoder/p/10290379.html

.NET Core 对象到字节数组的序列化和反序列化相关推荐

  1. C#实现对象的Xml格式序列化及反序列化

    要序列化的对象的类: [Serializable] public class Person { private string name; public string Name { get { retu ...

  2. Java对象的serialVersionUID在序列化和反序列化的用途

    本博客主要转自如下链接 http://blog.csdn.net/javazejian/article/details/52665164 这篇文章写的不错,但是有些地方我估计博主没有亲自测试,所以有些 ...

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

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

  4. java序列化和反序列化对象_java中的序列化与反序列化,还包括将多个对象序列化到一个文件中...

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...

  5. java clone 序列化_关于Java对象深度Clone以及序列化与反序列化的使用

    ‍        我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 ...

  6. Xson:Java对象序列化和反序列化工具

    1. Xson 介绍  Xson是一个Java对象序列化和反序列化程序.支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化.  地址:https://github.com/xso ...

  7. oracle存储过程如何传递一个bean对象_对象传输,序列化和反序列化

    一.前言 二.基本概念 2.1 序列化和反序列化的定义及最重要的作用 序列化的定义:Java序列化就是指把Java对象转换为字节序列的过程: 反序列化的定义:Java反序列化就是指把字节序列恢复为Ja ...

  8. 深入分析Java的序列化与反序列化

    阅读目录 Java对象的序列化 如何对Java对象进行序列化与反序列化 序列化及反序列化相关知识 ArrayList的序列化 ObjectOutputStream 总结 序列化是一种对象持久化的手段. ...

  9. jackson (json、xml的序列化与反序列化)

    jackson用于java对象到json的序列化与反序列化.还支持xml格式. jackson用于实现json与java对象的序列与反序列化.web service要实现跨机器传送对象那么就需要有一种 ...

  10. java基础提升篇:深入分析Java的序列化与反序列化

    初遇 序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么 ...

最新文章

  1. STM32 SPI的使用
  2. 使用SpringBoot的jackson包进行实体类型转换
  3. https跨域到http问题解决
  4. 利用快排查询无序数组第k位大的数
  5. Java Web开发小结
  6. traybox错误怎么办_toolbox提示错误无法使用怎么办?
  7. 张洁的新书「流浪的老狗」
  8. 查看zookeeper注册了哪些服务
  9. idc机房运维巡检_20年代IDC的“新十二大”基础设施系统你都了解吗?
  10. 斐讯N1救砖指南!值得收藏
  11. 百度杀毒,360安全卫士的那些私下的功夫 。
  12. 中标麒麟服务器性能怎么样,中标麒麟Linux系统的性能分析及工具(74页)-原创力文档...
  13. OPENGL OSG setNearFarRatio可以动态调节远近剪裁面
  14. C语言程序设计 | 大小端
  15. 可编辑手写PDF以图片形式转换为WORD
  16. SecureCRT for linux安装教学
  17. 树莓派64位系统bullseye如何成功安装Qt5
  18. 王亟亟的Python学习之路(五)-dictionary,set,函数,函数参数
  19. net-tools is needed by mysql-community-server-5.7.21-1.el7.x86_64
  20. android游戏特效,直播中送礼物短音效实现(支持网络,本地,assets)

热门文章

  1. 无限制翻译PDF文件——低调使用
  2. 2021年中国消费金融行业贷款情况及发展趋势分析:互联网消费金融放款规模达到20.2万亿[图]
  3. 32位计算机处理64位数据,Win7 64位/32位电脑系统支持多大内存
  4. 考取FRM证书的三大好处,可能你还不知道
  5. 2021GPLT L1-8 乘法口诀数列(JAVA语言)
  6. 物联网蓝牙芯片的选型
  7. 8b/10b编码技术系列(二):Disparity、RD、8b/10b编码
  8. 中国语料库研究的历史与现状-冯志伟教授
  9. 两组的数据平均值合并_数据平均值合并计算 合并计算求平均值
  10. 携程网不能访问的真相曝光