BinaryFormatter के साथ यह कर करेंगे प्रकार की जानकारी का एक बहुत बचत होती है ठीक से deserialize करने में सक्षम हो। आप कुछ सख्त प्रोटोकॉल के माध्यम से comunicate करने के लिए कॉम्पैक्ट क्रमबद्धता या चाहते हैं, तो आप इस तरह explictly यह करना होगा:
public byte[] ToByteArray()
{
List<byte> result = new List<byte>();
result.AddRange(BitConverter.GetBytes(One));
result.AddRange(BitConverter.GetBytes(Two));
result.AddRange(BitConverter.GetBytes(Three));
result.AddRange(BitConverter.GetBytes(Four));
return result.ToArray();
}
यहाँ
मैं बाइट सरणी में अपने UInt32 में से प्रत्येक को बदलने और सरणी जिसके परिणामस्वरूप में संग्रहीत।
संपादित
बाहर बदल जाता है वहाँ struct
और Marshal
सबसे पहले आप struct
बनाने का उपयोग करके एक और तरीका है और उस जैसी विशेषताओं के चिह्नित:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string StringField;
public int IntField;
}
यहाँ LayoutKind.Sequential
clr स्मृति में खेतों रखने के लिए बताता है घोषणा के रूप में एक ही क्रम में। Pack = 1
संरचनाओं के बिना आवश्यकतानुसार अधिक स्मृति ले सकते हैं। जैसा struct
एक short
क्षेत्र और एक byte
जरूरतों केवल 3 बाइट्स, लेकिन डिफ़ॉल्ट रूप से साथ यह आकार सबसे अधिक संभावना हो जाएगा 4 (प्रोसेसर एकल बाइट जोड़ तोड़ के लिए निर्देश, 2 बाइट्स और 4 बाइट, clr बलिदान struct के कहने के अनुसार एक बाइट मात्रा को कम करने के लिए किया आधे से मशीन कोड के निर्देशों के)। अब आप बाइट्स कॉपी करने के लिए Marshal
उपयोग कर सकते हैं:
public static byte[] GetBytes<T>(T str)
{
int size = Marshal.SizeOf(str);
var bytes = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(ptr);
}
}
सब कुछ सरल प्रकार के साथ ठीक काम करता है। इस तरह के string
के रूप में जटिल प्रकार के लिए आप MarshalAs
विशेषता का उपयोग करना होगा और यह उपयोग कर रहा है है में थोड़ा और अधिक जटिल (उदाहरण में मैं clr बताया तय 50 बाइट्स आकार की सरणी के रूप में स्ट्रिंग मार्शल करने के लिए)।
इसे 16 बाइट हां होना चाहिए। कोई सुझाव मुझे स्ट्रीमवाइटर का उपयोग कैसे करना चाहिए ?? –
मैंने अपना जवाब संपादित कर लिया है। परिणामी बाइट सरणी 16 बाइट्स होनी चाहिए यदि आप इसे सुझाते हैं। ध्यान दें कि यह केवल नमूना कोड है। मैंने इसका परीक्षण नहीं किया है, न ही यह 'उपयोग' कथन का उपयोग करता है जिसे आपको उन वस्तुओं के लिए उपयोग करना चाहिए जो 'IDISposable' जैसे 'मेमोरीस्ट्रीम' को लागू करते हैं। आप इसे अपने फू ऑब्जेक्ट में एक फ़ंक्शन बनाने का निर्णय ले सकते हैं, ताकि आप अपने बाइट सरणी प्राप्त करने के लिए foo.Serialize() को कॉल कर सकें। –