Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET 5'den başlayarak, BinaryFormatter bir nesne serileştirme veya seri durumdan çıkarma gerçekleştiğinde size görünürlük sağlayan bir yerleşik EventSource içerir. Uygulamalar bu bildirimleri dinlemek ve günlüğe kaydetmek için türetilmiş türler kullanabilir EventListener.
Bu işlevsellik, veya SerializationBinderISerializationSurrogate yerine geçmez ve seri hale getirilen veya seri durumdan çıkarılan verileri değiştirmek için kullanılamaz. Bunun yerine, bu olay sistemi seri hale getirilen veya seri durumdan çıkarılan türler hakkında içgörü sağlamak için tasarlanmıştır. Ayrıca, üçüncü taraf kitaplık kodundan kaynaklanan çağrılar gibi altyapıya BinaryFormatter yapılan istenmeyen çağrıları algılamak için de kullanılabilir.
Olayların açıklaması
Olay BinaryFormatter kaynağı iyi bilinen ada System.Runtime.Serialization.Formatters.Binary.BinaryFormatterEventSourcesahiptir. Dinleyiciler altı olaya abone olabilir.
SerializationStart olayı (id = 10)
çağrıldığında BinaryFormatter.Serialize ve serileştirme işlemi başlatıldığında tetiklenir. Bu olay, olayla eşleştirilmiştir SerializationEnd . Bir SerializationStart nesne kendi serileştirme yordamı içinde çağırırsa BinaryFormatter.Serialize olay özyinelemeli olarak çağrılabilir.
Bu olay yük içermiyor.
SerializationEnd olayı (id = 11)
Çalışması tamamlandığında yükseltildi BinaryFormatter.Serialize . Her geçtiğinde SerializationEnd , son eşleşmeyen olayın tamamlandığı belirtilir SerializationStart .
Bu olay yük içermiyor.
SerializingObject olayı (id = 12)
İlkel olmayan bir türü seri hale getirme işlemi sırasında BinaryFormatter.Serialize tetikleniyor. Altyapı BinaryFormatter özel durumlarının belirli türleri (ve gibi stringint) ve bu türlerle karşılaşıldığında bu olayı tetiklemiyor. Bu olay, kullanıcı tanımlı türler ve yerel olarak anlamayan BinaryFormatter diğer türler için oluşturulur.
Bu olay ve SerializationEnd olayları arasında SerializationStart sıfır veya daha fazla kez tetiklenebilir.
Bu olay bir bağımsız değişken içeren bir yük içerir:
typeName(string): Seri hale getirilen türün derleme nitelikli adı (bkz Type.AssemblyQualifiedName. ).
Seri durumdan çıkarmaBaşlama olayı (id = 20)
Çağrıldığında BinaryFormatter.Deserialize ve seri durumdan çıkarma işlemi başlatıldığında tetiklenir. Bu olay, olayla eşleştirilmiştir DeserializationEnd . Bir DeserializationStart nesne kendi seri durumdan çıkarma yordamı içinde çağırırsa BinaryFormatter.Deserialize olay yinelemeli olarak çağrılabilir.
Bu olay yük içermiyor.
DeserializationEnd olayı (id = 21)
Çalışması tamamlandığında yükseltildi BinaryFormatter.Deserialize . Her geçtiğinde DeserializationEnd , son eşleşmeyen olayın tamamlandığı belirtilir DeserializationStart .
Bu olay yük içermiyor.
DeserializingObject olayı (id = 22)
İlkel olmayan bir türü seri durumdan çıkarma işlemi sırasında BinaryFormatter.Deserialize tetiklenir. Altyapı BinaryFormatter özel durumlarının belirli türleri (ve gibi stringint) ve bu türlerle karşılaşıldığında bu olayı tetiklemiyor. Bu olay, kullanıcı tanımlı türler ve yerel olarak anlamayan BinaryFormatter diğer türler için oluşturulur.
Bu olay ve DeserializationEnd olayları arasında DeserializationStart sıfır veya daha fazla kez tetiklenebilir.
Bu olay bir bağımsız değişken içeren bir yük içerir.
typeName(string): Seri durumdan çıkarılmakta olan türün derleme nitelikli adı (bkz Type.AssemblyQualifiedName. ).
[Gelişmiş] Bildirimlerin bir alt kümesine abone olmak
Bildirimlerin yalnızca bir alt kümesine abone olmak isteyen dinleyiciler hangi anahtar sözcüklerin etkinleştirileceğini seçebilir.
Serialization=(EventKeywords)1: ,SerializationEndveSerializingObjectolaylarınıSerializationStartoluşturur.Deserialization=(EventKeywords)2: ,DeserializationEndveDeserializingObjectolaylarınıDeserializationStartoluşturur.
Kayıt sırasında EventListener anahtar sözcük filtresi sağlanmazsa, tüm olaylar tetiklenir.
Daha fazla bilgi için bkz. System.Diagnostics.Tracing.EventKeywords.
Örnek kod
Aşağıdaki kod:
- , öğesine yazan
System.Console- türetilmiş birEventListenertür oluşturur. - dinleyicinin ürettiği bildirimlere
BinaryFormatterabone olması, - , ve kullanarak
BinaryFormatterbasit bir nesne grafiğini serileştirir ve seri durumdan çıkartır - tetiklenen olayları analiz eder.
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]}");
}
}
}
}
}
Yukarıdaki kod aşağıdaki örneğe benzer bir çıkış oluşturur:
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
Bu örnekte, serileştirmenin başladığı konsol tabanlı EventListener günlükler, ve Book örnekleri Person serileştirilir ve sonra serileştirme tamamlar. Benzer şekilde, seri durumdan çıkarma başladıktan sonra ve Book örnekleri Person seri durumdan çıkarılır ve seri durumdan çıkarma tamamlar.
Uygulama daha sonra seri durumdan çıkarılmış Person içinde bulunan değerleri yazdırarak nesnenin aslında düzgün seri hale getirildiğini ve seri durumdan çıkarıldığını gösterir.
Ayrıca bkz.
Tabanlı bildirimleri almak EventSourceiçin kullanma EventListener hakkında daha fazla bilgi için sınıfına EventListenerbakın.