gpt4 book ai didi

c# - 反序列化二进制文件的一部分

转载 作者:太空狗 更新时间:2023-10-29 21:34:54 24 4
gpt4 key购买 nike

是否可以反序列化二进制文件的一部分?

基本上我有一个类似于下面的对象,我将其序列化为一个二进制文件。

public class MyObject
{
public string Name { get; set; }

public int Value { get; set; }

public IList<MyOtherObject> { get; set; } // lots of data in here (order of kB-MB)
}

我想要的是能够通过填充 ListView 来反序列化 NameValue 以进行文件选择,然后在需要时反序列化文件的其余部分(即用户从 ListView 中选择该文件)。

一如既往,非常感谢任何帮助,如果建议任何第 3 方库,它们需要能够在商业环境中自由使用。

最佳答案

protobuf-net 可以做到这一点,因为它不依赖于特定类型;例如:

using ProtoBuf;
using System.Collections.Generic;
using System.IO;

[ProtoContract]
public class MyOtherObject { }
[ProtoContract]
public class MyObject
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public int Value { get; set; }
[ProtoMember(3)]
public IList<MyOtherObject> Items { get; set; }
}

[ProtoContract]
public class MyObjectLite
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public int Value { get; set; }
}

static class Program
{
static void Main()
{
var obj = new MyObject
{
Name = "abc",
Value = 123,
Items = new List<MyOtherObject>
{
new MyOtherObject(),
new MyOtherObject(),
new MyOtherObject(),
new MyOtherObject(),
}
};
using (var file = File.Create("foo.bin"))
{
Serializer.Serialize(file, obj);
}
MyObjectLite lite;
using (var file = File.OpenRead("foo.bin"))
{
lite= Serializer.Deserialize<MyObjectLite>(file);
}
}
}

但是如果您不想要两种不同的类型,和/或您不想添加属性——也可以这样做:

using ProtoBuf.Meta;
using System.Collections.Generic;
using System.IO;

public class MyOtherObject { }
public class MyObject
{
public string Name { get; set; }
public int Value { get; set; }
public IList<MyOtherObject> Items { get; set; }
}
static class Program
{
static readonly RuntimeTypeModel fatModel, liteModel;
static Program()
{
// configure models
fatModel = TypeModel.Create();
fatModel.Add(typeof(MyOtherObject), false);
fatModel.Add(typeof(MyObject), false).Add("Name", "Value", "Items");
liteModel = TypeModel.Create();
liteModel.Add(typeof(MyOtherObject), false);
liteModel.Add(typeof(MyObject), false).Add("Name", "Value");
}
static void Main()
{
var obj = new MyObject
{
Name = "abc",
Value = 123,
Items = new List<MyOtherObject>
{
new MyOtherObject(),
new MyOtherObject(),
new MyOtherObject(),
new MyOtherObject(),
}
};
using (var file = File.Create("foo.bin"))
{
fatModel.Serialize(file, obj);
}
MyObject lite;
using (var file = File.OpenRead("foo.bin"))
{
lite = (MyObject)liteModel.Deserialize(
file, null, typeof(MyObject));
}
}
}

关于c# - 反序列化二进制文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com