2012-11-12 16 views
6

का हिस्सा deserialize एक बाइनरी फ़ाइल का हिस्सा deserialize संभव है?बाइनरी फ़ाइल

असल में मेरे पास एक वस्तु है जो नीचे एक बाइनरी फ़ाइल में क्रमबद्ध है।

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

    public int Value { get; set; } 

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

मैं इसे फाइल चयन प्रयोजनों के लिए एक ListView को आबाद करने के माध्यम से ही Name और Value deserialize और फिर जब जरूरत फ़ाइल के बाकी deserialize करने में सक्षम होना चाहते हैं क्या (यानी उपयोगकर्ता द्वारा की गई फ़ाइल को चुनता है ListView

हमेशा की तरह, किसी भी मदद बहुत सराहना और यदि कोई 3 पार्टी पुस्तकालयों का सुझाव दिया जाता है कि वे एक व्यावसायिक वातावरण में स्वतंत्र रूप से इस्तेमाल किया जा करने में सक्षम हो की आवश्यकता होगी।

+1

के लायक हो सकता है इस बात का जिक्र करते हुए कि आपने फ़ाइल को पहले स्थान पर कैसे क्रमबद्ध किया है – musefan

+0

यहां एक समान प्रश्न है: http://stackoverflow.com/questions/1572999/c-sharp-partial-deserialization में वह उत्तर हो सकता है जिसे आप ढूंढ रहे हैं। –

+0

बस पुष्टि करना चाहते हैं, सूची देखें आइटम बाइनरी फ़ाइल के अनुभागों का प्रतिनिधित्व करते हैं, और आप केवल उन हिस्सों को लोड करना चाहते हैं जिन्हें उपयोगकर्ता चुनता है? – Derek

उत्तर

6

प्रोटोबफ-नेट ऐसा कर सकता है, क्योंकि यह विशिष्ट प्रकार से बंधे नहीं है; उदाहरण के लिए:

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)); 
     } 
    } 
} 
+1

+1। यह बहुत अच्छा है कि आप एक ही बाइट सरणी से दो अलग-अलग मॉडल प्राप्त कर सकते हैं। लेकिन क्या जरूरत पड़ने पर "आराम" को 'लाइट' में deserialize करने का कोई तरीका है? अगर मैं इस समाधान को सही तरीके से समझता हूं, तो आपको पूर्ण वस्तु की आवश्यकता होने पर 'लाइट' को फेंकने और 'fatModel' का उपयोग करके एक पूरी नई वस्तु को deserialize करने की आवश्यकता होगी। –

+0

तो आपके पहले उदाहरण में यह परवाह नहीं करता है कि जब तक संपत्ति के नाम और प्रकार और 'ProtoMember' मान समान हैं, तब तक यह किस वस्तु का deserializing है? कुछ मामलों में –

+0

@Eren, * हाँ * (प्रोटोबफ विलय योग्य है), लेकिन सामान्य मामले में मैं कहूंगा कि यह सिर्फ गलत दृष्टिकोण है। –

0

कैसे Name लगाने के बारे में और Value एक सुपरक्लास में और उन्हें अलग से क्रमबद्ध करना?

वैकल्पिक रूप से, आप एक शब्दकोश को बनाए रख सकते हैं और इसे एक फ़ाइल में क्रमबद्ध कर सकते हैं।

संबंधित मुद्दे