首页 > 其他分享 >二进制序列化和字符串序列化

二进制序列化和字符串序列化

时间:2024-07-31 16:28:43浏览次数:17  
标签:MyObject obj 二进制 json 字符串 new byte 序列化

经常用json字符串序列化,倒是忘记也可做二进制序列化。

在文件上传时,如果序列化为字符串,再按字符串上传,这样是否会数据量变大呢?今天试了试

两种序列化方式:dotnet自带的BinaryFormatter和Newtonsoft

 

    private void button3_Click(object sender, EventArgs e)
    {
        MyObject obj = new MyObject { IntProperty = 1, StringProperty = "Samplk中文化e" };
        obj.buf = new byte[2000];
        obj.buf[0] = 3;

        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream msg = new MemoryStream();
        formatter.Serialize(msg, obj);
        byte[] ppp = msg.ToArray(); //长度2252

        msg.Position = 0;
        MyObject deserializedObj = formatter.Deserialize(msg) as MyObject;

        //DataContractSerializer
    }

    private void button4_Click(object sender, EventArgs e)
    {
        MyObject obj = new MyObject { IntProperty = 1, StringProperty = "Samplk中文化e" };
        obj.buf = new byte[2000];
        obj.buf[0] = 3;

        byte[] binaryData;
        using (var memoryStream = new MemoryStream())
        {
            using (var binaryWriter = new BinaryWriter(memoryStream))
            {
                var json = JsonConvert.SerializeObject(obj); //json长度2742
                binaryWriter.Write(json);
                binaryData = memoryStream.ToArray(); //长度2732
            }
        }

        // 反序列化二进制数据回对象
        MyObject deserializedObject;
        using (var memoryStream = new MemoryStream(binaryData))
        {
            using (var binaryReader = new BinaryReader(memoryStream))
            {
                var json = binaryReader.ReadString();
                deserializedObject = JsonConvert.DeserializeObject<MyObject>(json) as MyObject;
            }
        }
    }

    private void button5_Click(object sender, EventArgs e)
    {
        byte[] buf = File.ReadAllBytes("e:\\图片2.png"); //图片长度426748
        using (var memoryStream = new MemoryStream())
        {
            using (var binaryWriter = new BinaryWriter(memoryStream))
            {
                string json = JsonConvert.SerializeObject(buf);
                int len = json.Length; //字符串长度569002
                binaryWriter.Write(json);
                byte[] binaryData = memoryStream.ToArray();  //字节数组长度569005
            }
        }

        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream msg = new MemoryStream();
        formatter.Serialize(msg, buf);
        byte[] ppp = msg.ToArray(); //ppp的长度426776

    }
}

[Serializable]
public class MyObject
{
    public int IntProperty { get; set; }
    public string StringProperty { get; set; }
    public byte[] buf { get; set; }

}

  

以上说明:

使用BinaryFormatter序列化后数据比较短,和原数据差不多。但Newtonsoft要先序列化为字符串,再转到二进制,操作了两遍,同时数据大小的膨胀也较大 

标签:MyObject,obj,二进制,json,字符串,new,byte,序列化
From: https://www.cnblogs.com/81/p/18334934

相关文章

  • mysql的sql怎么拼接字符串类型?
    在MySQL中,字符串拼接通常不使用+号,而是使用CONCAT()函数。MySQL并不支持用+号直接进行字符串接。在MySQL中,+号用于数值运算。使用CONCAT()函数进行字符串拼接示例:SELECTCONCAT('Hello','','World')ASgreeting;结果:+----------+|greeting|+---......
  • 当密码包含特殊字符时写入连接字符串
    我正在将SQLalchemy用于Python项目,并且希望有一个整洁的连接字符串来访问我的数据库。例如:engine=create_engine('postgresql://user:pass@host/database')问题是我的密码包含一系列特殊字符,当我尝试连接时,这些字符被解释为分隔符。我意识到我可以使用engin......
  • Unity引擎字符串内存布局
      Unity引擎的字符串有三种存储方式:堆:分配在堆上内嵌:一个栈上的内存数据。默认25字节,可以放长度最多24的字符串。这个长度定义为STACK_LENGTH. 外部  重点主要是前两种,这是一种优化方法,对于非常短的字符串,可以直接使用栈数据而不需要再次内存分配。C++伪代......
  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......
  • 学习笔记 String类案例练习 1.模拟用户登录 2.统计字符串英文字母大小写及数字个数
    目录案例一模拟用户登录需求:代码: 案例二统计字符串英文字母大小写及数字个数需求:代码:案例一模拟用户登录需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示代码:publicstaticvoidmain(String[]args){......
  • 二进制转十进制
    题目描述输入一个二进制数,请你求出它对应的十进制数。二进制是由0和1构成的数。请根据下面两个式子找出二进制数转化为十进制的规则。1011010(二进制)=$1\times2^6+0\times2^5+1\times2^4+1\times2^3+0\times2^2+1\times2^1+0\times2^0$=$1\times64+0\times32......
  • C/C++ 字符串常量的注意事项
    在C/C++中使用字符串常量时,需要注意以下几个关键点,以确保代码的正确性和高效性:存储位置:字符串常量通常存储在只读存储区(如文本段),这意味着它们不能被修改。尝试修改字符串常量将导致未定义行为,通常是程序崩溃。类型:在C中,字符串常量的类型是char数组的形式,但其末尾自动......
  • Leetcode每日一题 20240727 3106.满足约束且字典序最小的字符串
    题目描述给你一个字符串s和一个整数k。定义函数distance(s1,s2),用于衡量两个长度为n的字符串s1和s2之间的距离,即:字符‘a’到‘z’按循环顺序排列,对于区间[0,n-1]中的i,计算所有「s1[i]和s2[i]之间最小距离」的和。例如,distance(“ab”,......
  • 格式化字符串(summer2024_fmt)
    参考博客[参考博客]:https://blog.csdn.net/ysy___ysy/article/details/135700140[参考博客]:https://blog.csdn.net/2402_83422357/article/details/139180404戳此切大佬博客https://blog.csdn.net/Morphy_Amo/article/details/122215773https://blog.csdn.net/song_lee/......
  • Atcoder 356 C - Keys 二进制枚举
    原题链接:https://atcoder.jp/contests/abc356/tasks/abc356_c C-Keys:问题陈述您有 N 个编号为1,2,…,N 的密钥。其中一些是真钥匙,其他都是假钥匙。有一扇门,门X,你可以插入任意数量的钥匙。只有插入至少 K 把真钥匙,X门才会打开。你已经对这些钥匙进行了 M 次......