对象转成json后转成byte[]后在转成string会提示序列化失败,第一个字符是问号

问题复现

一个对象需要转成json 后转成byte[]后经过网络传输,后再次反序列化为对象,但是最后反序列的时候会报错,打印json发现开头是一个问号

省流

使用这个进行反序列化

     /// <summary>/// 反序列化方法/// </summary>/// <typeparam name="T"></typeparam>/// <param name="json"></param>/// <returns></returns>public static T Deserialize<T>(string json) where T : Message, new(){return JsonConvert.DeserializeObject<T>(json.TrimStart('\uFEFF'));}

问题代码

一个对象

using System.Threading;namespace SocketTools
{public class TextMessage : Message{private string message;public string Message { get => message; set => message = value; }public TextMessage(){}public TextMessage(string userName, string targetName, string sendTime, string message) : base(userName, targetName, sendTime, MessageType.Text){this.message = message;}}

父类

using Newtonsoft.Json;namespace SocketTools
{public enum MessageType{Connection = 0,Text,Image,Mixed,Recall,File,}public class Message{private string userName;private string targetName;private string sendTime;private MessageType messageType;public string UserName { get => userName; set => userName = value; }public string TargetName { get => targetName; set => targetName = value; }public string SendTime { get => sendTime; set => sendTime = value; }public MessageType MessageType { get => messageType; set => messageType = value; }public Message(){}public Message(string userName, string targetName, string sendTime, MessageType messageType){UserName = userName;TargetName = targetName;SendTime = sendTime;MessageType = messageType;}// 序列化方法public static string Serialize(Message message){return JsonConvert.SerializeObject(message);}// 反序列化方法public static T Deserialize<T>(string json) where T : Message, new(){ return JsonConvert.DeserializeObject<T>(json );}}}}

执行代码

using SocketTools;
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;namespace FunctionalTesting
{internal class Program{private static void Main(string[] args){string msg = "消息内容Q1_2_end";string userName = "AAAAAAAAAAAAAAAA";string targetUserName = "CCCCCCCCCCCCCCCC";TextMessage textMessage = new TextMessage(userName,targetUserName,DateTime.Now.ToString("yy-MM-dd-H:m:s"),msg);// 按照指定的格式创建消息字符串string message = Message.Serialize(textMessage);Console.WriteLine(message);// 将消息字符串转换为字节流byte[] data;using (MemoryStream ms = new MemoryStream()){using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8)){sw.Write(message);sw.Flush();ms.Position = 0;data = ms.ToArray();}}string data2 = Encoding.UTF8.GetString(data);Console.WriteLine(data2);data2 = Regex.Replace(data2, @"^\s+", "");Console.WriteLine(data2);var d = Message.Deserialize<TextMessage>(data2);Console.WriteLine(d.TargetName);Console.WriteLine(d.UserName);Console.WriteLine(d.MessageType);Console.ReadLine();}}
}

执行后的效果

执行之后会输出

?{"Message":"消息内容Q1_2_end","UserName":"AAAAAAAAAAAAAAAA","TargetName":"CCCCCCCCCCCCCCCC","SendTime":"23-12-04-1:14:43","MessageType":1}

错误日志:

Newtonsoft.Json.JsonReaderExceptionHResult=0x80131500Message=Unexpected character encountered while parsing value: . Path '', line 0, position 0.

但是打印原本的数据是没有开头的问号的,

解决方式

修改反序列化的代码,去除第一个前导字符即可,或者使用字符串的判断,如果第一个字符不是{或者[ 就去除第一个字符

  // 反序列化方法public static T Deserialize<T>(string json) where T : Message, new(){ return JsonConvert.DeserializeObject<T>(json.TrimStart('\uFEFF'));}

去除字符串

      public static T Deserialize<T>(string json) where T : Message, new(){ if (json[0] == '{' || json[0] == '['){}else{json = json.Remove(0, 1);}return JsonConvert.DeserializeObject<T>(json);}

问题原因

零宽度不中断空格(Unicode U+FEFF)字符,也称为 BOM(Byte Order Mark),在文本文件中用于表示字节顺序。它通常出现在使用 Unicode 编码的文本文件或数据流的开头。

在处理多字节编码时,需要知道每个字符的字节顺序。例如,在 UTF-16 编码中,一个字符由两个字节组成,而这两个字节的顺序可能会根据不同的系统和平台有所不同。为了明确表示字节顺序,引入了 BOM 字符。

BOM 字符 U+FEFF 可以作为文件的前导字符,允许解析器识别文件的字节顺序。当解析器遇到 U+FEFF 时,它可以确定字节顺序并正确地解码文件中的其余字符。

在某些情况下,尤其是在网络通信、数据库存储或其他形式的数据交换中,BOM 字符可能被无意间包含在字符串中,这可能导致解析错误。因此,有必要在处理这些字符串之前检查并移除任何不需要的 BOM 字符。

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

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

相关文章

Java 中如何正确的将 float 转换成 double?

为什么 double 转 float 不会出现数据误差&#xff0c;而 float 转 double 却误差如此之大&#xff1f; double d 3.14; float f (float)d; System.out.println(f);输出结果是:3.14; float f 127.1f; double d f; System.out.println(d);输出结果是&#xff1a;127.09999…

【USRP】5G / 6G 原型系统 5g / 6G prototype system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络&#xff0c;基于开源的代码&#xff0c;专为科研用户设计。 软件无线电架构&#xff0c;构建真实5G移动通信系统 X410 采用了目前流行的异构式系统&#xff0c;融合了FP…

【毕业设计】基于雷达与深度学习的摔倒检测——微多普勒效应

运动物体的微多普勒效应为人体动作识别提供了可能&#xff0c;基于雷达的居家检测具有良好的隐私保护性&#xff0c;且不易受环境因素影响&#xff08;如光照、温度等&#xff09;&#xff0c;近年来已受到国内外学者的广泛关注。由于雷达信号的非平稳特性&#xff0c;通过短时…

Oracle-CDB容器数据库修改service_names踩坑

前言: 最近在对一套Oracle容器数据库进行迁移测试时&#xff0c;为了保持新环境与旧环境的服务名一致&#xff0c;需要在新环境添加旧环境的服务名&#xff0c;在CDB的根容器通过service_name参数添加旧环境的服务名之后&#xff0c;发现数据库PDB的服务名全部被注销&#xff0…

自动驾驶学习笔记(十四)——感知算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知算法 开发过程 测试和评价 前言…

[leetcode 哈希表] 模版

文章目录 1.有效字母的异位词 E2. 两个数组的交集 E3.快乐数 E4. 两数之和 E5. **topk(前k个高频元素) M** 1.有效字母的异位词 E :::details 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次…

一致性哈希算法,hash(key)是负值时,会出现异常吗?

一致性哈希算法,hash(key)是负值时,会出现异常吗? 一致性哈希算法中&#xff0c;哈希函数hash(key)的返回值通常是一个非负整数。如果hash(key)返回负值&#xff0c;则可能会出现一些问题&#xff0c;例如无法正确地映射对象到哈希环上的位置&#xff0c;或者无法正确地找到…

【PTA-C语言】编程练习3 - 循环结构Ⅱ

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习3 - 循环结构&#xff08;9~15&#xff09; 7-9 特殊a串数列求和&#xff08;分数 15&#xff09;7-10 穷举法搬运砖块问题&#xff08;分数 15&#xff09;7-11 数字金字塔&#xff08;分数 15&…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Prop@Link@State状态装饰器(十二)

文章目录 一、哪些是状态装饰器二、StatePropLink状态传递的核心规则三、状态装饰器练习 一、哪些是状态装饰器 1、State&#xff1a;被装饰拥有其所属组件的状态&#xff0c;可以作为其子组件单向和双向同步的数据源。当其数值改变时&#xff0c;会引起相关组件的渲染刷新。 …

思维模型 赫洛克效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。及时反馈&#xff0c;激发动力。 1 赫洛克效应的应用 1.1 赫洛克效应在管理中的应用 美国惠普公司是一家全球知名的科技公司&#xff0c;该公司非常注重员工的激励和认可。在惠普公司&…

网络和Linux网络_9(应用层和传输层_笔试选择题)

目录 一. 常见应用协议等等 1. 以下不是合法HTTP请求方法的是( ) 2. 文件传输使用的协议是&#xff08;&#xff09; 3. HTTP1.1的请求方法不包括&#xff1f;() 4. http状态码中&#xff0c;( )表示访问成功&#xff0c;( )表示坏请求&#xff0c;( )表示服务不可用。() …

mysql的几种索引

mysql可以在表的一列、或者多列上创建索引&#xff0c;索引的类型可以选择&#xff0c;如下&#xff1a; 普通索引&#xff08;KEY&#xff09; 普通索引可以提高查询效率。在表的一列、或者多列上创建索引。 每个表可以创建多个普通索引。 例如&#xff0c;下面示例&#…

智能优化算法应用:基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.海洋捕食者算法4.实验参数设定5.算法结果…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(21)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(20) 距离本系列上一篇文章发布的时间已经过去了十多天,虽然这样算下来时间不算长,但笔者感觉上都快过了一个月没更新了。这可能是在我心里一直把Linux图形、尤其是DRM、libdrm这块看得很重,总想尽快往…

实现一个简单的网络通信下(udp)

时间过去好久了&#xff0c;先回忆一下上一篇博客的代码&#xff01;&#xff01; 目前来看&#xff0c;我们客户端发一条消息&#xff0c;我服务器收到这一条消息之后呢&#xff0c;服务器也知道了是谁给我发来的消息&#xff0c;紧接这就把这条消息放进buffer当中&#xff0c…

伸展树你需要了解一下

介绍 伸展树&#xff08;Splay Tree&#xff09;是一种平衡二叉搜索树&#xff0c;它能在O(log n)内完成插入、查找和删除操作。它是丹尼尔斯立特Daniel Sleator 和 罗伯特恩卓塔扬Robert Endre Tarjan 在1985年发明的。 伸展树是一种自调整形式的二叉查找树&#xff0c;它会在…

51单片机项目(18)——基于51单片机的大棚环境监测系统

1.功能描述 首先使用DS18B20&#xff0c;测量土壤温度&#xff0c;并显示在OLED屏幕左边。然后使用土壤湿度传感器测量土壤湿度&#xff0c;因为这个传感器输出的值是模拟量&#xff0c;所以需要使用AD转换模块。本次使用ADC0832&#xff0c;这是一个8位精度的AD转换模块&#…

MATLAB算法实战应用案例精讲-【路径规划】 图搜索算法

目录 前言 几个高频面试题目 运动规划、路径规划、轨迹规划对比 1. 运动规划 2. 路径规划VS轨迹规划

大数据技术学习笔记(七)—— Zookeeper

目录 1 Zookeeper 概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 数据结构1.5 应用场景 2 Zookeeper 安装3 客户端命令行操作4 Zookeeper 的 Java 客户端操作4.1 IDEA 环境搭建4.2 初始化 ZooKeeper 客户端4.3 创建子节点4.4 获取子节点4.5 判断Znode是否…

深入理解 Kafka 集群搭建与管理

Apache Kafka 作为分布式流处理平台的核心&#xff0c;其集群搭建与管理是确保高可用性和高性能的关键。本文将深入研究 Kafka 集群的构建、配置、工作原理、节点角色以及一些高级管理策略&#xff0c;以助力读者更深层次地理解和灵活运用 Kafka 集群。 Kafka 集群基础 1 集群…