【发布时间】:2019-03-10 01:30:58
【问题描述】:
我的目标是在字节数组的字段中发送包含标头对象和压缩数据的 JSON。
[JsonObject(MemberSerialization.OptOut)]
public class Message
{
public Message()
{
Header = new Header();
}
public Header Header { get; set; }
public byte[] Data { get; set; }
}
字节数组是 gzip 压缩的 JSON 对象,但这无关紧要。我遇到的问题是,如果我序列化 JSON,它会转换为字符串,然后再转换回字节。问题是,消息大小增加了很多,因为序列化字节数组会将其转换为字符串表示形式。
我受到最大消息大小的限制,并且我已经在适当的位置吐出压缩数据,但是当我发送包含字节数组和未压缩标头中的压缩数据的 JSON 时,序列化 JSON 对象使我超出了消息大小限制。
是否有任何可靠的方法可以立即将 JSON 对象转换为字节数组。
var stringMessage = JsonConvert.SerializeObject(message,Formatting.None);
var bytes = Encoding.UTF8.GetBytes(stringMessage);
var stringMessage2 = JsonConvert.SerializeObject(message.TransportHeader, Formatting.None);
var bytes2 = Encoding.UTF8.GetBytes(stringMessage2);
Message eventMessage = new Message(bytes);
var bytes3= Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message.Transportdata));
压缩后的数据大小=243905
序列化后的完整 JSON 字节数 = 325313
仅以字节为单位的标头 =90
只是将压缩数据序列化并转换回字节 = 325210,(当数据被 JsonConvert.SerializeObject 序列化并生成字符串表示时,大小会增加)
明显上升了不少,是字节数组引起的。
【问题讨论】:
-
如果您使用@ygaradon 的答案,请传入
MemoryStream,然后使用ToArray()获取byte[] -
不是重复的。他的问题是他的序列化大小出乎意料地大。
-
您是否考虑过使用多部分/混合内容类型而不是直接的 JSON 通过网络发送数据?将您的 JSON 放在一部分中,将二进制数据放在另一部分中。
-
存在 JSON 部分,因此可以识别二进制数据并将其拼凑在一起,如果没有 json 标头,就不可能重新组合拆分和压缩的数据。而且我不能单独发送两个,因为无法知道哪个标头属于哪个包。