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

.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

时间: 2024-10-08 10:22:26

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

理解PHP数组的序列化和反序列化

当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类型转换为字符串,方便数组存库操作.对PHP数组进行序列化和反序列化操作,主要就用到两个函数,serialize和unserialize. 一.PHP数组序列化:serialize 1 $arr = array('PHP','Java','Python','C'); 2 $result = serialize($arr); 3 echo $result; 运行:

Java将对象写入文件读出——序列化与反序列化

Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的. 写入: 1 File aFile=new File("e:\\c.txt"); 2 Stu a=new Stu(1, "aa", "1"); 3 FileOutputStream fileOutputStream=null; 4 try { 5 fileOutputStream = new FileOutputStream(aFi

java对象与字符串的序列化和反序列化

package com.mzj.practice.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Seri

Java Object 对象序列化和反序列化

Java Object 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制(深拷贝):在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机. 反序列化是把流结构的对象恢复为其原有形式 2.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但

序列化、反序列化的版本控制以及序列化、反序列化集合对象

当涉及到跨进程甚至是跨域传输数据的时候,我们需要把对象序列化和反序列化. 首先可以使用Serializable特性. [Serializable] public class Person { public string _firstName; public string _secondName; //序列化 [OnSerializing] internal void OnSerializing(StreamingContext context) { _firstName = _firstName

PHP数组序列化和反序列化

PHP序列化在我们实际项目运行过程中是一种非常常见的操作.比如当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类型转换为字符串,这样就方便数组存库操作. 我们对PHP数组进行序列化和反序列化操作,主要就用到两个函数,serialize和unserialize. 一.PHP数组序列化:serialize <?php $data=['PHP','HTML','Java','Python']; echo seria

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

阅读目录 Java对象的序列化如何对Java对象进行序列化与反序列化序列化及反序列化相关知识ArrayList的序列化ObjectOutputStream总结 序列化是一种对象持久化的手段.普遍应用在网络传输.RMI等场景中.本文通过分析ArrayList的序列化来介绍Java序列化的相关内容.主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列化策略 自定义的序列化策略是如何被调

序列化与反序列化之Parcelable和Serializable浅析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52665164 出自[zejian的博客] 本篇小部分内容摘自android开发艺术探索 ??在日常的应用开发中,我们可能需要让某些对象离开内存空间,存储到物理磁盘,以便长期保存,同时也能减少对内存的压力,而在需要时再将其从磁盘读取到内存,比如将某个特定的对象保存到文件中,隔一段时间后再把它读取到内存中使用,那么该对象就需要实现序列化操作,在java中可以使用Seri

夯实Java基础系列22:一文读懂Java序列化和反序列化

本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文参考 http://www.importnew.com/17964.html和 https://www.ibm.com/developerworks/cn/java/j-lo-serial/ 序列化与反序列化概念 序列化 (S