के साथ मिलकर मैं किसी ऑब्जेक्ट के कस्टम क्रमबद्धता/deserialization करने के साथ-साथ DeflateStreams के साथ serialized डेटा को संपीड़ित/decompressing करने की कोशिश कर रहा हूँ। मैंने मूल रूप से इसे अधिक जटिल वस्तुओं के लिए किया लेकिन समस्या को हल करने और समझने के लिए इसे काट दिया, हालांकि यह अभी भी और अधिक परेशान हो गया है क्योंकि यह अभी भी वहां है।सी # कस्टम सीरियलाइजेशन/Deserialization DeflateStreams
[Serializable]
public class RandomObject : ISerializable
{
public String Name { get; set; }
public String SavePath { get; set; }
public RandomObject()
{
}
public RandomObject(String name, String savepath)
{
Name = name;
SavePath = savepath;
}
public RandomObject(SerializationInfo info, StreamingContext context)
: this(info.GetString("name"), info.GetString("savepath"))
{
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("name", Name);
info.AddValue("savepath", SavePath);
}
}
यहाँ और कोड है कि यह (जो काम करने के लिए लगता है) को क्रमानुसार ले आते है: यहां है अक्रमांकन
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, profile);
using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
{
try
{
using (FileStream fs = File.Create(path))
{
ds.Flush();
Miscellaneous.CopyStream(ds.BaseStream, fs);
fs.Flush();
fs.Close();
}
}
catch (IOException e)
{
MessageBox.Show(e.Message);
success = false;
}
ds.Close();
}
ms.Close();
}
और: यहाँ वर्ग धारावाहिक जा करने के लिए/deserialized है
RandomObject profile = null;
using (FileStream fs = File.OpenRead(path))
{
using (DeflateStream ds = new DeflateStream(fs, CompressionMode.Decompress))
{
BinaryFormatter bf = new BinaryFormatter();
ds.Flush();
using (MemoryStream ms = new MemoryStream())
{
Miscellaneous.CopyStream(ds.BaseStream, ms);
profile = bf.Deserialize(ms) as RandomObject;
profile.SavePath = path;
ms.Close();
}
ds.Close();
}
fs.Close();
}
अब समस्या के लिए। Deserialization संदेश {"ऑब्जेक्ट के लिए कोई नक्शा '201326592' संदेश के साथ एक serializationException फेंकता है।"} मुझे नहीं पता कि समस्या का कारण क्या है समस्या निवारण या पता लगाने के लिए। बहुत ही बुनियादी क्रमबद्धता तब काम करती है जब मैं एक ही मेमोरीस्ट्रीम पर बाइनरीफॉर्मेटर की सीरियल और Deserialize विधियों को चलाता हूं।
मैंने दोनों विधियों से DeflateStream सामान को हटाने का प्रयास किया, लेकिन यह अभी भी वही समस्या है। जब मैं एमएसडीएन और अन्य स्थानों पर उदाहरणों को देखता हूं तो ऐसा लगता है कि मैं इसे सही कर रहा हूं, और अपवाद संदेश के लिए googling कोई सार्थक परिणाम नहीं देता है (या शायद मैं खोज में बस खराब हूँ)।
पीएस। जैसा कि आप देख सकते हैं कि मैं Miscellaneous.CopyStream (src, dest) का उपयोग करता हूं जो मूल स्ट्रीम कॉपीियर है, क्योंकि मुझे src.CopyTo (dest) बिल्कुल काम नहीं मिल सकता है, इसलिए उस पर किसी भी संकेत का स्वागत है।
नीचे यदि आप और अधिक बारीकी से इस पर गौर करना चाहते हैं पूरे VS2010 परियोजना के लिए एक लिंक है: http://www.diredumplings.com/SerializationTesting.zip
अद्यतन:
The_Smallest: मैं कम्प्रेस विधि आप पर पोस्ट उपयोग करने की कोशिश मेरी क्रमबद्धता:
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
bf.Serialize(stream, profile);
byte[] array = Compress(stream);
using (MemoryStream ms = new MemoryStream(array))
{
using (FileStream fs = File.Create(path))
{
ms.WriteTo(fs);
fs.Flush();
}
}
}
हालांकि, यह मुझे एक ही समस्या है कि मैंने पहले srcStream.CopyTo (destStream) के साथ किया था देने के लिए लगता है, जो है यह है कि प्रतीत होता है कि स्ट्रीम में लिखा नहीं है। जब मैं इसे डिस्क पर सहेजने का प्रयास करता हूं तो परिणाम 0 केबी फ़ाइल होता है। कोई विचार?
पीटर: मैंने मेमरीस्ट्रीम को deserialization विधि से हटा दिया और ऐसा लगता है कि पहले की तरह ही कार्यक्षमता है। हालांकि मुझे यकीन नहीं है कि आपके द्वारा सुझाए गए क्रमबद्धरण को कैसे कार्यान्वित किया जाए। क्या यह है जो आप के मन में था?
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = File.Create(path))
{
using (DeflateStream ds = new DeflateStream(fs, CompressionMode.Compress))
{
bf.Serialize(ds, profile);
fs.Flush();
ds.Close();
}
fs.Close();
}
आप दोनों को धन्यवाद!
और क्या है Stream.Copy के साथ समस्या? यह क्यों विफल रहता है? –
इससे कोई फर्क नहीं पड़ता कि मैं इसका उपयोग कैसे करता हूं गंतव्य स्ट्रीम हमेशा खाली होती है, हो सकता है कि मैं बस कुछ बेवकूफ कर रहा हूं। – vesz