簡體   English   中英

將 Newtonsoft JSON 序列化為字節數組

[英]Serialize Newtonsoft JSON to byte array

我的目標是在字節數組字段中發送包含標頭對象和壓縮數據的 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 序列化並產生字符串表示時,大小會增加)

它顯然上升了很多,並且是由字節數組引起的。

我找到了一種方法來做我想做的事,它不完全是 JSON,而是 BSON 或也稱為二進制 JSON。 好吧,既然找到解決方案純屬運氣,我不確定 BSON 的知名度如何。

無論如何,Newtonsoft 通過位於https://www.nuget.org/packages/Newtonsoft.Json.Bson/1.0.1 的Newtonsoft.Json.Bson nuget 包支持它

一些用於序列化/反序列化的代碼

            foreach (var message in transportMessageList)
        {
            MemoryStream ms = new MemoryStream();
            using (BsonDataWriter writer = new BsonDataWriter(ms))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(writer, message);
            }

            var bsonByteArray = ms.ToArray();
            Assert.True(bsonByteArray.Length!=0);
            bsonList.Add(bsonByteArray);
        }

        var deserializdTransmortMessageList = new List<TransportMessage>();
        foreach (var byteArray in bsonList)
        {
            TransportMessage message;
            MemoryStream ms = new MemoryStream(byteArray);
            using (BsonDataReader reader = new BsonDataReader(ms))
            {
                JsonSerializer serializer = new JsonSerializer();
                message = serializer.Deserialize<TransportMessage>(reader);
            }
            Assert.True(message.Transportdata.Length!=0);
            deserializdTransmortMessageList.Add(message);
        }

您可以使用與 JSON 相同的類/對象,序列化壓縮的字節數組不再導致大小增加。

請注意,Newtonsoft 網站上的 BSON 文檔已過時,目前僅列出已棄用的 api 調用。 我的代碼使用正確的非棄用 API 調用。

JSON 是一種基於字符的格式,因此必然涉及字符數據。 我懷疑你使用了 UTF16 編碼,它使每個字符變成兩個字節。 如果您使用UTF8您將不會遇到任何有意義的大小開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM