C# 根据.NET核心中的前16个字符从流中反序列化JSON
我得到一个Gziped JSON,我检查它是否有特定的开始字符串,如果它正确,我将反序列化到我的对象中:C# 根据.NET核心中的前16个字符从流中反序列化JSON,c#,.net,json,performance,gzipstream,C#,.net,Json,Performance,Gzipstream,我得到一个Gziped JSON,我检查它是否有特定的开始字符串,如果它正确,我将反序列化到我的对象中: await using var decompressionStream = new GZipStream(externalStream, CompressionMode.Decompress); var streamReader = new StreamReader(decompressionStream); string eventString = streamReader.ReadTo
await using var decompressionStream = new GZipStream(externalStream, CompressionMode.Decompress);
var streamReader = new StreamReader(decompressionStream);
string eventString = streamReader.ReadToEnd();
if (!eventString.StartsWith("SomeString"))
{
// Drop it because it can't be deserialized
return;
}
MyObject item = Utf8Json.JsonSerializer.Deserialize<MyObject>(Encoding.UTF8.GetBytes(eventString));
wait using var decompressionStream=new GZipStream(externalStream,CompressionMode.Decompress);
var streamReader=新的streamReader(解压流);
string eventString=streamReader.ReadToEnd();
如果(!eventString.StartsWith(“SomeString”))
{
//删除它,因为它无法反序列化
返回;
}
MyObject item=Utf8Json.JsonSerializer.Deserialize(Encoding.UTF8.GetBytes(eventString));
这种方法可以工作,但当Utf8Json可以直接从流反序列化时,将流转换为字符串并返回到字节数组似乎是浪费
因为3/4的传入流包含不同类型的数据,并且无法反序列化,所以我不想在其周围放置try/catch块,因为许多异常将过于昂贵
有没有一种方法可以在不消耗前16个字符的情况下查看它们?[Read_Char[],Int32,Int32](阅读),这是否回答了您的问题?该read命令消耗读取的数据,因此在检查第一个字符后,我无法使用该流进行反序列化,因为它缺少前n个字符。编辑:Peek只能用于1个字符,不幸的是,我需要更多的字符来确定类型。Peek不会消耗数据,但不会走得更远。也许第一个字符足以将抛出次数减少一个合理的幅度。也许您希望将第一个n字符存储在从StreamReader继承的变量或包装类中。但据我所知,您将以任何方式读取这16个字符,您可以从流中读取前N个字节,并将它们与
“SomeString”
的字节表示形式进行比较。假设它们匹配,将N
字节放入MemoryStream
中,并使用ConcatenatedStream
from-to将其与GZipStream
[Read_Char[],Int32,Int32\]()的其余部分组合,这是否回答了您的问题?该read命令消耗读取的数据,因此在检查第一个字符后,我无法使用该流进行反序列化,因为它缺少前n个字符。编辑:Peek只能用于1个字符,不幸的是,我需要更多的字符来确定类型。Peek不会消耗数据,但不会走得更远。也许第一个字符足以将抛出次数减少一个合理的幅度。也许您希望将第一个n字符存储在从StreamReader继承的变量或包装类中。但据我所知,您将以任何方式读取这16个字符,您可以从流中读取前N个字节,并将它们与“SomeString”
的字节表示形式进行比较。假设它们匹配,将N
字节放入MemoryStream
中,并使用ConcatenatedStream
from-to将其与gzip流的其余部分组合。