【问题标题】:Deserialize Bytes Array directly to Object in JSON.Net将字节数组直接反序列化为 JSON.Net 中的对象
【发布时间】:2017-03-03 09:41:10
【问题描述】:

我正在读取一个包含大数据的 json 文件并将其反序列化为对象。我试图通过读取字节并反序列化来提高性能。但是当我搜索它时,它说我必须将它转换为字符串才能反序列化它。有什么办法可以直接反序列化而不转成字符串。

以下是我所做的。

byte[] bytesArray = File.ReadAllBytes(path);
var bytesAsString = Encoding.ASCII.GetString(bytesArray);
object person = JsonConvert.DeserializeObject<List<PersonList>>(bytesAsString);

我想去掉第二行,直接进入下一步,即跳过转字符串。

using (StreamReader file = File.OpenText(path))
{
    JsonSerializer jsonSerializer = new JsonSerializer
    {
       NullValueHandling = NullValueHandling.Ignore
    };
    object person = (object)jsonSerializer.Deserialize(file, typeof(List<PersonList>));
}

以上代码我读取了整个文件并将其转换为对象。我读取字节的目的是提高这段代码的性能。

【问题讨论】:

标签: c# json serialization


【解决方案1】:

没有。 如果不将其转换为字符串,就无法反序列化整个对象。

原因很简单:Json Deserializer 必须读取 while JSON(文本)才能对其进行标记。所以反序列化可以发生。

编辑:您可以做的是读取(大)文本文件的特定部分并反序列化它们。这可以提高你的表现。但是:你必须在这里再次使用字符串

Edit2:当您说“大数据”时,您是指需要大量数据还是仅指大量字节?可能您的班级有许多不需要的数据(例如私有字段,动态生成的列表)。您可以使用 JsonIgnore 属性从 json 中“删除”它们。

【讨论】:

  • 我能够读取文件并对其进行反序列化。我已经更新了这个问题。有什么方法可以让它更快。
  • 然后将 File.ReadAllBytes(path); 替换为 File.ReadAllText(path);
  • 并将其直接存储在字符串变量中
  • 并且:如果你已经指定了反序列化对象的类型,请不要将结果存储在 Object 变量中,请使用 varList >
  • 我决定坚持我现在所拥有的
【解决方案2】:

您需要对字符串进行反序列化...但也许您可以直接调用 System.IO.File.ReadAllText()... 但我认为这不会大大提高速度,因为 ReadAllText 也必须进行编码。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多