प्रोटोबफ-नेट ऐसा कर सकता है, क्योंकि यह विशिष्ट प्रकार से बंधे नहीं है; उदाहरण के लिए:
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));
}
}
}
स्रोत
2012-11-12 11:13:23
के लायक हो सकता है इस बात का जिक्र करते हुए कि आपने फ़ाइल को पहले स्थान पर कैसे क्रमबद्ध किया है – musefan
यहां एक समान प्रश्न है: http://stackoverflow.com/questions/1572999/c-sharp-partial-deserialization में वह उत्तर हो सकता है जिसे आप ढूंढ रहे हैं। –
बस पुष्टि करना चाहते हैं, सूची देखें आइटम बाइनरी फ़ाइल के अनुभागों का प्रतिनिधित्व करते हैं, और आप केवल उन हिस्सों को लोड करना चाहते हैं जिन्हें उपयोगकर्ता चुनता है? – Derek