Aracılığıyla paylaş


NetDataContractSerializer İşlevselliğini Sağlamak için DataContractSerializer ve DataContractResolver Kullanma

NetDcSasDcSwithDCR örneği, DataContractSerializer kullanımının uygun DataContractResolver ile NetDataContractSerializer ile aynı işlevselliği nasıl sağladığını gösterir. Bu örnek, nasıl uygun DataContractResolver oluşturulacağını ve bunun DataContractSerializer öğesine nasıl ekleneceğini gösterir.

Örnek ayrıntılar

NetDataContractSerializer, DataContractSerializer bir önemli şekilde farklıdır: NetDataContractSerializer, serileştirilmiş XML'de CLR tür bilgilerini içerirken, ancak DataContractSerializer'te bu bilgi yoktur. Bu nedenle, NetDataContractSerializer yalnızca seri hale getirme ve seri durumdan çıkarma uçlarının aynı CLR türlerini paylaşması durumunda kullanılabilir. Ancak DataContractSerializer, performansı NetDataContractSerializer'den daha iyi olduğu için önerilir. seri hale getirilmiş DataContractSerializer bilgileri, buna bir DataContractResolver ekleyerek değiştirebilirsiniz.

Bu örnek iki projeden oluşur. İlk proje, bir nesneyi seri hale getirmek için kullanır NetDataContractSerializer . İkinci proje, ilk projeyle aynı işlevselliği sağlamak için DataContractSerializer ve DataContractResolver kullanır.

DCSwithDCR projesinde, DataContractResolver öğesine eklenen, MyDataContractResolver adlı özel bir DataContractSerializer uygulamasının nasıl gerçekleştirildiğini gösteren aşağıdaki kod örneği.

class MyDataContractResolver : DataContractResolver
{
    private XmlDictionary dictionary = new XmlDictionary();

    public MyDataContractResolver()
    {
    }

    // Used at deserialization
    // Allows users to map xsi:type name to any Type
    public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
    {
        Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null);
        type ??= Type.GetType(typeName + ", " + typeNamespace);
        return type;
    }

    // Used at serialization
    // Maps any Type to a new xsi:type representation
    public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {
        knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace);
        if (typeName == null || typeNamespace == null)
        {
            XmlDictionary dictionary = new XmlDictionary();
            typeName = dictionary.Add(dataContractType.FullName);
            typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
        }
    }
}

Bu örneği kullanmak için

  1. Visual Studio'yu kullanarak DCRSample.sln çözüm dosyasını açın.

  2. Çözüm dosyasına sağ tıklayın ve Özellikler'i seçin.

  3. Çözüm Özellik Sayfaları iletişim kutusundaki Ortak Özellikler, Başlangıç Projesi'nin altında Birden çok başlangıç projesi: öğesini seçin.

  4. DCSwithDCR projesinin yanındaki Eylem açılır menüsünden Başlat'ı seçin.

  5. NetDCS projesinin yanındaki Başlat'ı, Eylem açılır listesinden seçin.

  6. İletişim kutusunu kapatmak için Tamam'a tıklayın.

  7. Çözümü oluşturmak için Ctrl+ ShiftB+ basın.

  8. Çözümü çalıştırmak için CtrlF5+ basın.