[Serileştirilebilir] nedir ve ne zaman kullanmalıyım?


Yanıtlar:


368

Bu ne?

Bir .Net framework uygulamasında bir nesne oluşturduğunuzda, verilerin bellekte nasıl saklandığını düşünmenize gerek yoktur. Çünkü .Net Framework bunu sizin yerinize halleder. Ancak, bir nesnenin içeriğini bir dosyaya depolamak, bir nesneyi başka bir işleme göndermek veya ağ üzerinden iletmek istiyorsanız, nesnenin nasıl temsil edildiğini düşünmeniz gerekir, çünkü farklı bir biçime dönüştürmeniz gerekir . Bu dönüşüme SERIALIZATION denir.

Serileştirme için Kullanımlar

Serileştirme, geliştiricinin bir nesnenin durumunu kaydetmesine ve gerektiğinde yeniden oluşturmasına olanak tanıyarak nesnelerin depolanmasını ve veri alışverişini sağlar. Serileştirme yoluyla bir geliştirici, nesneyi bir Web Hizmeti aracılığıyla uzak bir uygulamaya göndermek, bir nesneyi bir etki alanından diğerine geçirmek, bir nesneyi güvenlik duvarından XML dizesi olarak geçirmek veya güvenliği veya kullanıcıya özgü tutmak gibi eylemler gerçekleştirebilir uygulamalar arasında bilgi.

SerializableAttributeBu tür örneklerin serileştirilebileceğini belirtmek için bir türe uygulayın . SerializableAttributeSınıf ISerializableserileştirme sürecini kontrol etmek için arabirimi uygulasa bile uygulayın .

SerializableAttributeTürü ISerializableserileştirme işlemini geçersiz kılmak için arabirim uygulamadığı sürece, ile işaretlenen bir türdeki tüm ortak ve özel alanlar varsayılan olarak serileştirilir. Varsayılan serileştirme işlemi ile işaretli alanları hariç tutar NonSerializedAttribute. Serileştirilebilir türdeki bir alan, belirli bir ortama özgü bir işaretçi, tanıtıcı veya başka bir veri yapısı içeriyorsa ve farklı bir ortamda anlamlı bir şekilde yeniden oluşturulamıyorsa, NonSerializedAttributebu alana uygulamak isteyebilirsiniz .

Daha fazla ayrıntı için MSDN'ye bakın.

Düzenle 1

Bir şeyi serileştirilebilir olarak işaretlememek için herhangi bir neden

Veri aktarırken veya kaydederken, yalnızca gerekli verileri göndermeniz veya kaydetmeniz gerekir. Dolayısıyla, aktarım gecikmeleri ve depolama sorunları daha az olacaktır. Böylece serileştirirken gereksiz veri yığınlarını devre dışı bırakabilirsiniz.


1
@dwbartz Sorularınızı burada bulabilirsiniz link
jayasurya_j

2
Güzel bir açıklama, bunu
MSDN'deki

@jayasurya_j Çok kötü kabul edilen cevap özel bölümler
Alexander

1
İyi Açıklama
Zakir HC

42

[Serializable]Özellik için bazı pratik kullanımlar :

  • İkili serileştirme kullanarak nesne durumunu kaydetme; uygulamanızdaki tüm nesne örneklerini bir dosyaya veya ağ akışına kolayca 'kaydedebilir' ve ardından serisini kaldırarak yeniden oluşturabilirsiniz - BinaryFormatterSystem.Runtime.Serialization.Formatters.Binary'da sınıfa bakın
  • Nesne örnekleri panoya kaydedilemeyen Clipboard.SetData()sınıflar - serileştirilemeyen sınıflar panoya yerleştirilemez.
  • .NET Remoting ile uyumlu yazma sınıfları; genel olarak, uygulama etki alanları (içinden genişleyenler hariç) arasında ilettiğiniz tüm sınıf örnekleri MarshalByRefObjectserileştirilebilir olmalıdır.

Bunlar, karşılaştığım en yaygın kullanım durumları.


42

Orijinal soru SerializableAttribute ile ilgili olduğundan, bu özelliğin yalnızca BinaryFormatter veya SoapFormatter kullanılırken geçerli olduğuna dikkat edilmelidir.

Ayrıntılara gerçekten dikkat etmediğiniz sürece, ne zaman kullanılacağı ve gerçek amacının ne olduğu konusunda biraz kafa karıştırıcı.

XML veya JSON serileştirme ile ilgisi yoktur.

SerializableAttribute ile kullanılan ISerializable Arabirimi ve SerializationInfo Sınıfıdır. Bunlar sadece BinaryFormatter veya SoapFormatter ile birlikte kullanılır.

Sınıfınızı Binary veya Soap kullanarak serileştirmeyi düşünmüyorsanız, sınıfınızı [Serializable] olarak işaretlemekten çekinmeyin. XML ve JSON serileştiricileri varlığının farkında bile değil.


16
"XML veya JSON serileştirme ile ilgisi yoktur" - TEŞEKKÜR EDERİZ! Sonunda neden bu özniteliği veya niteliği olmadan herhangi bir sınıfı XML'e seri hale getirebileceğimin açıklaması
userSteve

1
Bunun için kaynağın mevcut mu?
Michiel van Oosterhout

"XML ve JSON serileştiricileri varlığının farkında bile değil". Bunu bilmiyorum. I JSON, bir sınıfı WCF aracılığıyla biçimlendirdiğinde, özellik isimleri sınıf varsa Serializableve öznitelik kaldırıldığında önceki bir alt çizgiyle çıktı . Yani biraz parazit olabilir.
Jens

@Jens doğru anladıysanız JSON.net bu konuda bir bit umurumda değil ama asp.net bu davranışı biraz değiştirir. Bu JsonObject / JsonProperty öznitelikleri ile atlayabilir inanıyorum.
Temel

29

Serileştirme, nesneyi saklamak veya belleğe, veritabanına veya bir dosyaya iletmek için bir nesneyi bayt akışına dönüştürme işlemidir.

Serileştirme Nasıl Çalışır?

Bu şekilde genel serileştirme süreci gösterilmektedir.

resim açıklamasını buraya girin

Nesne, yalnızca verileri değil, sürüm, kültür ve montaj adı gibi nesnenin türü hakkında da bilgi taşıyan bir akışa serileştirilir. Bu akıştan bir veritabanında, dosyada veya bellekte saklanabilir.

Ayrıntılar msdn.



14

serileştirme

Serileştirme, bir nesneyi veya bir dizi nesne grafiğini bir akışa dönüştürme işlemidir, ikili serileştirme durumunda bir bayt dizisidir

Serileştirmenin Kullanım Alanları

  1. Bir nesnenin durumunu bir dosyaya, veritabanına vb. Kaydetmek ve daha sonra kullanmak.
  2. Bir nesneyi bir işlemden aynı makinede başka bir uygulamaya (Uygulama Etki Alanı) göndermek ve aynı zamanda kabloyu başka bir makinede çalışan bir işleme göndermek için.
  3. Ana nesne üzerinde çalışırken orijinal nesnenin bir kopyasını yedek olarak oluşturmak için.
  4. Bir nesne kümesi kolayca sistem panosuna kopyalanabilir ve daha sonra aynı veya başka bir uygulamaya yapıştırılabilir

Aşağıda, bir nesnenin serileştirilmesi sırasında kullanılan bazı yararlı özel özellikler bulunmaktadır

[Serializable] - biz bir nesnenin seri hale getirilebilir işaretlediğinizde> O kullanılır [NonSerialized] biz bir nesnenin alanını seri hale getirmek istemiyorum> O kullanılır -. [OnSerializing] -> Bir nesneyi serileştirirken bir eylem gerçekleştirmek istediğimizde kullanılır [OnSerialized] -> Bir nesneyi akışa serileştirdikten sonra bir eylem gerçekleştirmek istediğimizde kullanılır.

Serileştirme örneği aşağıdadır

[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
        }

    }

İşte arama kodu

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();
        }

    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.