第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你怎么知道使用protobuf-net反序列化的字節(jié)數(shù)組的長度?

你怎么知道使用protobuf-net反序列化的字節(jié)數(shù)組的長度?

C#
翻翻過去那場雪 2022-08-20 16:11:38
我正在嘗試使用內(nèi)存映射文件將C#對象從一個進程發(fā)送到另一個進程,并且我正在嘗試使用BinaryFormatter或protobuf-net。兩者都不起作用 - 顯然因為我必須使用固定長度的字節(jié)數(shù)組,而protobuf-net需要一個完全正確長度的數(shù)組?使用protobuf-net,我在Deserialize上得到了這個例外:“ProtoException:'緩沖區(qū)中剩余的未消耗數(shù)據(jù);這表明輸入損壞了:“message1 = Serializer.Deserialize(memoryStream);這是我的代碼。在這一點上,我只是嘗試一個簡單的例子,以便讓它在基本級別上工作:這是我想在程序之間發(fā)送的對象:[ProtoContract]public class IpcMessage{    public IpcMessage() { }    [ProtoMember(1)]    public string title { get; set; }    [ProtoMember( 2 )]    public string content { get; set; }}以下是發(fā)送IpcMessage對象的(簡化 - 我刪除了同步)代碼:static void SampleSend(){    // Create the memory-mapped file which allows 'Reading' and 'Writing'    using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen( "MyMmfName", 1024, MemoryMappedFileAccess.ReadWrite ))    {        // Create a view-stream for this process, which allows us to write data from offset 0 to 1024 (whole memory)        using (MemoryMappedViewStream mmvStream = mmf.CreateViewStream( 0, 1024))        {            IpcMessage message1 = new IpcMessage();            message1.title = "test";            message1.content = "hello world";            Serializer.Serialize( mmvStream, message1 );        }    }}當(dāng)我試圖使用BinaryFormatter時,它也抱怨過。顯然,我正在做一些基本上錯誤的事情。通過其他問題查看 - 我看到大多數(shù)實現(xiàn)似乎都有一個字節(jié)數(shù)組,該數(shù)組被分配到恰到好處的長度。在這里,我事先不知道長度 - 它只是一個固定長度的1024字節(jié)數(shù)組(我隨意選擇這個大小,只是現(xiàn)在)?;蛘咭苍S我錯過了一些明顯的東西?這是我第一次使用內(nèi)存映射文件或protobuf-net。任何幫助或建議都值得贊賞 - 提前感謝您。
查看完整描述

1 回答

?
慕田峪7331174

TA貢獻(xiàn)1828條經(jīng)驗 獲得超13個贊

選項1:告訴在可選構(gòu)造函數(shù)重載中使用的正確字節(jié)數(shù);這將適用于所有序列化程序。MemoryStream

選項2,特別是對于原始buf-net:使用;API 接受 a  a ;后者可以用名義長度構(gòu)建,不會過度閱讀ProtoReaderDeserializeStreamProtoReader

選項 3,同樣是 protobuf-net:使用 API 進行序列化和反序列化*WithLengthPrefix

請注意,任何選項都假定您的代碼可以可靠地確定長度,這通常應(yīng)該在您使用的任何“框架”方法中單獨傳達(dá)。選項3在內(nèi)部處理這個問題,但在許多情況下,你自己的代碼仍然需要幀感知,這樣你就不會消耗太多,并閱讀I到下一條消息(除非這是UDP,每個數(shù)據(jù)包只有一幀,但是......它不是,因為)。您還需要考慮如果負(fù)載大于預(yù)期的緩沖區(qū)大小會發(fā)生什么情況。MemoryMappedFile

最簡單的“成幀”方法是在每個邏輯塊的開頭保留4個字節(jié);從偏移量 4 開始進行序列化,然后在偏移量 0 到 3 處使用固定的 4 字節(jié)布局(通常為“小”)寫回偏移量 0 到 3 處寫入的字節(jié)數(shù)。讀取時:讀取前4個字節(jié)以獲取長度,然后從段消耗該字節(jié)數(shù)。這本質(zhì)上是內(nèi)部功能,除了支持一些不同的布局選項。*WithLengthPrefix


查看完整回答
反對 回復(fù) 2022-08-20
  • 1 回答
  • 0 關(guān)注
  • 183 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號