Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dimulai dengan .NET 5, BinaryFormatter menyertakan EventSource bawaan yang memberi Anda visibilitas saat serialisasi atau deserialisasi objek terjadi. Aplikasi dapat menggunakan jenis turunan dari EventListener untuk mendengarkan pemberitahuan ini dan mencatatnya.
Fungsionalitas ini bukan pengganti dari SerializationBinder atau ISerializationSurrogate dan tidak dapat digunakan untuk mengubah data yang diserialisasikan atau dideserialisasi. Sebaliknya, sistem kejadian ini dimaksudkan untuk memberikan wawasan tentang jenis yang diserialisasi atau di-deserialisasi. Ini juga dapat digunakan untuk mendeteksi panggilan yang tidak diinginkan ke infrastruktur BinaryFormatter, seperti panggilan yang berasal dari kode pustaka pihak ketiga.
Deskripsi kejadian
Sumber kejadian BinaryFormatter memiliki nama terkenal System.Runtime.Serialization.Formatters.Binary.BinaryFormatterEventSource. Pendengar dapat berlangganan enam acara.
Kejadian SerializationStart (id = 10)
Muncul saat BinaryFormatter.Serialize telah dipanggil dan telah memulai proses serialisasi. Kejadian ini dipasangkan dengan kejadian SerializationEnd. Kejadian SerializationStart dapat dipanggil secara rekursif jika objek memanggil BinaryFormatter.Serialize dalam rutinitas serialisasinya sendiri.
Aktivitas ini tidak berisi payload.
Peristiwa SerializationEnd (id = 11)
Dimunculkan saat BinaryFormatter.Serialize telah menyelesaikan pekerjaannya. Setiap kemunculan SerializationEnd menunjukkan penyelesaian kejadian SerializationStart terakhir yang belum berpasangan.
Aktivitas ini tidak berisi payload.
SerializingObject event (id = 12)
Dimunculkan saat BinaryFormatter.Serialize sedang dalam proses serialisasi jenis non-primitif. Infrastruktur BinaryFormatter membuat jenis tertentu menjadi kasus khusus (seperti string dan int) dan tidak memunculkan kejadian ini saat jenis ini ditemui. Kejadian ini dimunculkan untuk jenis yang ditentukan pengguna dan jenis BinaryFormatter lain yang tidak dipahami secara native.
Kejadian ini dapat dimunculkan sebagai nol atau beberapa kali lebih antara kejadian SerializationStart dan SerializationEnd.
Aktivitas ini berisi payload dengan satu argumen:
typeName(string): Nama yang memenuhi syarat perakitan (lihat Type.AssemblyQualifiedName) dari jenis yang diserialisasikan.
Kejadian DeserializationStart (id = 20)
Muncul saat BinaryFormatter.Deserialize telah dipanggil dan telah memulai proses deserialisasi. Kejadian ini dipasangkan dengan kejadian DeserializationEnd. Kejadian DeserializationStart dapat dipanggil secara rekursif jika objek memanggil BinaryFormatter.Deserialize dalam rutinitas deserialisasinya sendiri.
Aktivitas ini tidak berisi payload.
Kejadian DeserializationEnd (id = 21)
Dimunculkan saat BinaryFormatter.Deserialize telah menyelesaikan pekerjaannya. Setiap kemunculan DeserializationEnd menunjukkan penyelesaian kejadian DeserializationStart terakhir yang belum berpasangan.
Aktivitas ini tidak berisi payload.
DeserializingObject event (id = 22)
Dimunculkan saat BinaryFormatter.Deserialize sedang dalam proses deserialisasi jenis non-primitif. Infrastruktur BinaryFormatter membuat jenis tertentu menjadi kasus khusus (seperti string dan int) dan tidak memunculkan kejadian ini saat jenis ini ditemui. Kejadian ini dimunculkan untuk jenis yang ditentukan pengguna dan jenis BinaryFormatter lain yang tidak dipahami secara native.
Kejadian ini dapat dimunculkan sebagai nol atau beberapa kali lebih antara kejadian DeserializationStart dan DeserializationEnd.
Aktivitas ini berisi payload dengan satu argumen.
typeName(string): Nama yang memenuhi syarat perakitan (lihat Type.AssemblyQualifiedName) dari jenis yang di-deserialisasikan.
[Lanjutan] Berlangganan subset notifikasi
Pendengar yang ingin berlangganan ke sebagian pemberitahuan saja dapat memilih kata kunci yang akan diaktifkan.
Serialization=(EventKeywords)1: Memunculkan kejadianSerializationStart,SerializationEnd, danSerializingObject.Deserialization=(EventKeywords)2: Memunculkan kejadianDeserializationStart,DeserializationEnd, danDeserializingObject.
Jika tidak ada filter kata kunci yang disediakan selama pendaftaran EventListener, semua peristiwa akan dinaikkan.
Untuk informasi selengkapnya, lihat System.Diagnostics.Tracing.EventKeywords.
Kode sampel
Kode berikut:
- membuat jenis turunan dari
EventListeneryang menulis keSystem.Console, - membuat pendengar berlangganan ke pemberitahuan yang diproduksi
BinaryFormatter, - menserialisasikan dan mendeserialisasi grafik objek sederhana menggunakan
BinaryFormatter, dan - menganalisis aktivitas yang telah dimunculkan.
using System;
using System.Diagnostics.Tracing;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace BinaryFormatterEventSample
{
class Program
{
static EventListener? _globalListener = null;
static void Main(string[] args)
{
// First, set up the event listener.
// Note: We assign it to a static field so that it doesn't get GCed.
// We also provide a callback that subscribes this listener to all
// events produced by the well-known BinaryFormatter source.
_globalListener = new ConsoleEventListener();
_globalListener.EventSourceCreated += (sender, args) =>
{
if (args.EventSource?.Name ==
"System.Runtime.Serialization.Formatters.Binary.BinaryFormatterEventSource")
{
((EventListener?)sender)?
.EnableEvents(args.EventSource, EventLevel.LogAlways);
}
};
// Next, create the Person object and serialize it.
Person originalPerson = new Person()
{
FirstName = "Logan",
LastName = "Edwards",
FavoriteBook = new Book()
{
Title = "A Tale of Two Cities",
Author = "Charles Dickens",
Price = 10.25m
}
};
byte[] serializedPerson = SerializePerson(originalPerson);
// Finally, deserialize the Person object.
Person rehydratedPerson = DeserializePerson(serializedPerson);
Console.WriteLine
($"Rehydrated person {rehydratedPerson.FirstName} {rehydratedPerson.LastName}");
Console.Write
($"Favorite book: {rehydratedPerson.FavoriteBook?.Title} ");
Console.Write
($"by {rehydratedPerson.FavoriteBook?.Author}, ");
Console.WriteLine
($"list price {rehydratedPerson.FavoriteBook?.Price}");
}
private static byte[] SerializePerson(Person p)
{
MemoryStream memStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
#pragma warning disable SYSLIB0011 // BinaryFormatter.Serialize is obsolete
formatter.Serialize(memStream, p);
#pragma warning restore SYSLIB0011
return memStream.ToArray();
}
private static Person DeserializePerson(byte[] serializedData)
{
MemoryStream memStream = new MemoryStream(serializedData);
BinaryFormatter formatter = new BinaryFormatter();
#pragma warning disable SYSLIB0011 // Danger: BinaryFormatter.Deserialize is insecure for untrusted input
return (Person)formatter.Deserialize(memStream);
#pragma warning restore SYSLIB0011
}
}
[Serializable]
public class Person
{
public string? FirstName;
public string? LastName;
public Book? FavoriteBook;
}
[Serializable]
public class Book
{
public string? Title;
public string? Author;
public decimal? Price;
}
// A sample EventListener that writes data to System.Console.
public class ConsoleEventListener : EventListener
{
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
base.OnEventWritten(eventData);
Console.WriteLine($"Event {eventData.EventName} (id={eventData.EventId}) received.");
if (eventData.PayloadNames != null)
{
for (int i = 0; i < eventData.PayloadNames.Count; i++)
{
Console.WriteLine($"{eventData.PayloadNames[i]} = {eventData.Payload?[i]}");
}
}
}
}
}
Kode sebelumnya menghasilkan output yang mirip dengan contoh berikut:
Event SerializationStart (id=10) received.
Event SerializingObject (id=12) received.
typeName = BinaryFormatterEventSample.Person, BinaryFormatterEventSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Event SerializingObject (id=12) received.
typeName = BinaryFormatterEventSample.Book, BinaryFormatterEventSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Event SerializationStop (id=11) received.
Event DeserializationStart (id=20) received.
Event DeserializingObject (id=22) received.
typeName = BinaryFormatterEventSample.Person, BinaryFormatterEventSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Event DeserializingObject (id=22) received.
typeName = BinaryFormatterEventSample.Book, BinaryFormatterEventSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Event DeserializationStop (id=21) received.
Rehydrated person Logan Edwards
Favorite book: A Tale of Two Cities by Charles Dickens, list price 10.25
Dalam sampel ini, log EventListener berbasis konsol yang dimulai serialisasi, instans Person dan Book diserialisasikan, lalu serialisasi selesai. Demikian pula, setelah deserialisasi dimulai, instans Person dan Book dideserialisasi, dan kemudian deserialisasi selesai.
Aplikasi kemudian mencetak nilai yang terkandung dalam deserialisasi Person untuk menunjukkan bahwa objek tersebut sebenarnya melakukan serialisasi dan deserialisasi dengan benar.
Lihat juga
Untuk informasi selengkapnya tentang menggunakan EventListener untuk menerima pemberitahuan berbasis EventSource, lihat kelas EventListener.