ฉันพบว่าบางคลาสใช้[Serializable]
คุณสมบัติ
- มันคืออะไร?
- ฉันควรใช้เมื่อใด
- ฉันจะได้รับประโยชน์อะไรบ้าง
ฉันพบว่าบางคลาสใช้[Serializable]
คุณสมบัติ
คำตอบ:
เมื่อคุณสร้างวัตถุในแอปพลิเคชัน. Net Framework คุณไม่จำเป็นต้องคิดเกี่ยวกับวิธีการจัดเก็บข้อมูลในหน่วยความจำ เพราะ. Net Framework จะดูแลสิ่งนั้นให้คุณ อย่างไรก็ตามหากคุณต้องการจัดเก็บเนื้อหาของวัตถุไปยังไฟล์ส่งวัตถุไปยังกระบวนการอื่นหรือส่งผ่านเครือข่ายคุณต้องคิดเกี่ยวกับวิธีการแสดงวัตถุเนื่องจากคุณจะต้องแปลงเป็นรูปแบบอื่น . การแปลงนี้เรียกว่า SERIALIZATION
การทำให้เป็นอนุกรมช่วยให้นักพัฒนาสามารถบันทึกสถานะของวัตถุและสร้างใหม่ได้ตามต้องการจัดเก็บข้อมูลของวัตถุและแลกเปลี่ยนข้อมูล ผู้พัฒนาสามารถดำเนินการต่าง ๆ เช่นการส่งวัตถุไปยังแอปพลิเคชันระยะไกลโดยใช้บริการเว็บผ่านวัตถุจากโดเมนหนึ่งไปยังอีกโดเมนหนึ่งผ่านวัตถุผ่านไฟร์วอลล์เป็นสตริง XML หรือรักษาความปลอดภัยหรือเฉพาะผู้ใช้ ข้อมูลข้ามแอปพลิเคชัน
นำSerializableAttribute
ไปใช้กับประเภทเพื่อระบุว่าอินสแตนซ์ของประเภทนี้สามารถต่อเนื่องกันได้ ใช้SerializableAttribute
คลาสถึงแม้ว่าจะใช้ISerializable
อินเทอร์เฟซเพื่อควบคุมกระบวนการทำให้เป็นอนุกรม
ฟิลด์สาธารณะและส่วนตัวทั้งหมดในประเภทที่มีการทำเครื่องหมายโดยSerializableAttribute
จะต่อเนื่องกันเป็นค่าเริ่มต้นเว้นแต่ประเภทที่ดำเนินการISerializable
อินเตอร์เฟซที่จะแทนที่กระบวนการอนุกรม NonSerializedAttribute
เขตข้อมูลที่ไม่รวมขั้นตอนการเริ่มต้นเป็นอันดับที่มีเครื่องหมาย หากเขตข้อมูลชนิดที่ต่อเนื่องกันได้มีตัวชี้หมายเลขอ้างอิงหรือโครงสร้างข้อมูลอื่น ๆ ที่เฉพาะเจาะจงกับสภาพแวดล้อมเฉพาะและไม่สามารถสร้างขึ้นใหม่อย่างมีความหมายในสภาพแวดล้อมที่แตกต่างกันคุณอาจต้องการนำNonSerializedAttribute
ไปใช้กับเขตข้อมูลนั้น
ดูMSDNสำหรับรายละเอียดเพิ่มเติม
แก้ไข 1
เหตุผลใด ๆ ที่จะไม่ทำเครื่องหมายสิ่งที่เป็นอนุกรม
เมื่อโอนหรือบันทึกข้อมูลคุณต้องส่งหรือบันทึกเฉพาะข้อมูลที่ต้องการ ดังนั้นจะมีความล่าช้าในการถ่ายโอนและปัญหาการเก็บข้อมูลน้อยลง ดังนั้นคุณสามารถยกเลิกการรับรู้ข้อมูลที่ไม่จำเป็นเมื่อทำการจัดลำดับ
การใช้งานในทางปฏิบัติสำหรับ[Serializable]
แอตทริบิวต์:
BinaryFormatter
คลาสใน System.Runtime.Serialization.Formatters.BinaryClipboard.SetData()
- คลาสที่ไม่สามารถทำได้บนคลิปบอร์ดMarshalByRefObject
) ต้องเป็นอนุกรมนี่คือกรณีการใช้งานทั่วไปที่ฉันเจอ
เนื่องจากคำถามเดิมเกี่ยวกับ SerializableAttribute จึงควรสังเกตว่าคุณลักษณะนี้จะใช้เฉพาะเมื่อใช้ BinaryFormatter หรือ SoapFormatter
มันค่อนข้างสับสนนอกเสียจากว่าคุณจะใส่ใจกับรายละเอียดจริงๆว่าจะใช้เมื่อไรและอะไรคือจุดประสงค์ที่แท้จริงของมัน
มันไม่มีอะไรเกี่ยวข้องกับการทำให้เป็นอนุกรม XML หรือ JSON
ใช้กับ SerializableAttribute เป็นอินเทอร์เฟซ ISerializable และ SerializationInfo คลาส สิ่งเหล่านี้ยังใช้กับ BinaryFormatter หรือ SoapFormatter เท่านั้น
ยกเว้นว่าคุณตั้งใจจะทำให้ชั้นของคุณเป็นแบบอนุกรมโดยใช้ Binary หรือ Soap อย่ารบกวนการทำเครื่องหมายในชั้นเรียนของคุณว่า [Serializable] XML และ JSON serializers ไม่ได้ตระหนักถึงการมีอยู่ของมัน
Serializable
และไม่มีเมื่อแอตทริบิวต์ถูกลบออก ดังนั้นการรบกวนบางอย่างเป็นไปได้
การทำให้เป็นอันดับเป็นกระบวนการของการแปลงวัตถุเป็นกระแสข้อมูลไบต์เพื่อเก็บวัตถุหรือส่งไปยังหน่วยความจำฐานข้อมูลหรือไฟล์
วิธีการทำให้เป็นอันดับ
ภาพประกอบนี้แสดงกระบวนการโดยรวมของการทำให้เป็นอนุกรม
วัตถุนั้นได้รับการต่อเนื่องเป็นกระแสซึ่งไม่เพียง แต่นำเสนอข้อมูล แต่เป็นข้อมูลเกี่ยวกับประเภทของวัตถุเช่นรุ่นวัฒนธรรมและชื่อแอสเซมบลี จากสตรีมนั้นสามารถเก็บไว้ในฐานข้อมูลไฟล์หรือหน่วยความจำ
นี่คือตัวอย่างสั้น ๆ เกี่ยวกับการทำงานของการทำให้เป็นอันดับ ฉันยังได้เรียนรู้เกี่ยวกับสิ่งเดียวกันและฉันพบว่าลิงก์ทั้งสองมีประโยชน์ อะไรเป็นอันดับและวิธีการที่สามารถทำได้ใน .NET
โปรแกรมตัวอย่างอธิบายการทำให้เป็นอนุกรม
ถ้าคุณไม่เข้าใจโปรแกรมดังกล่าวข้างต้นเป็นโปรแกรมที่ง่ายมากที่มีคำอธิบายจะได้รับที่นี่
การทำให้เป็นอันดับ
การทำให้เป็นอันดับเป็นกระบวนการของการแปลงวัตถุหรือชุดของกราฟวัตถุเป็นกระแสมันเป็นอาร์เรย์ไบต์ในกรณีของการเป็นอนุกรมไบนารี
การใช้งานของการทำให้เป็นอันดับ
ด้านล่างนี้เป็นคุณสมบัติที่กำหนดเองที่มีประโยชน์ที่ใช้ระหว่างการทำให้เป็นอันดับของวัตถุ
[Serializable] -> มันถูกใช้เมื่อเราทำเครื่องหมายวัตถุที่เป็นอนุกรม [NonSerialized] -> มันถูกใช้เมื่อเราไม่ต้องการทำให้เป็นเขตข้อมูลของวัตถุ [OnSerializing] -> มันถูกใช้เมื่อเราต้องการที่จะดำเนินการบางอย่างในขณะที่วัตถุเป็นอันดับ [OnSerialized] -> มันถูกใช้เมื่อเราต้องการที่จะดำเนินการบางอย่างหลังจากที่วัตถุเป็นอนุกรมในกระแส
ด้านล่างเป็นตัวอย่างของการทำให้เป็นอันดับ
[Serializable]
internal class DemoForSerializable
{
internal string Fname = string.Empty;
internal string Lname = string.Empty;
internal Stream SerializeToMS(DemoForSerializable demo)
{
DemoForSerializable objSer = new DemoForSerializable();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, objSer);
return ms;
}
[OnSerializing]
private void OnSerializing(StreamingContext context) {
Fname = "sheo";
Lname = "Dayal";
}
[OnSerialized]
private void OnSerialized(StreamingContext context)
{
// Do some work after serialized object
}
}
นี่คือรหัสการโทร
class Program
{
string fname = string.Empty;
string Lname = string.Empty;
static void Main(string[] args)
{
DemoForSerializable demo = new DemoForSerializable();
Stream ms = demo.SerializeToMS(demo);
ms.Position = 0;
DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean