Bagikan melalui


Menggunakan DataContractSerializer dan DataContractResolver untuk Menyediakan Fungsionalitas NetDataContractSerializer

Sampel NetDcSasDcSwithDCR menunjukkan cara penggunaan DataContractSerializer dengan DataContractResolver yang sesuai menyediakan fungsionalitas yang sama dengan NetDataContractSerializer. Sampel ini menunjukkan cara membuat DataContractResolver yang sesuai dan cara menambahkannya ke DataContractSerializer.

Detail Sampel

NetDataContractSerializer berbeda dari DataContractSerializer dalam satu cara penting: NetDataContractSerializer menyertakan informasi jenis runtime bahasa umum dalam XML yang diserialisasikan, sedangkan DataContractSerializer tidak. Oleh karena itu, NetDataContractSerializer dapat digunakan hanya jika ujung serialisasi dan deserialisasi berbagi jenis runtime bahasa umum yang sama. Namun, disarankan untuk digunakan DataContractSerializer karena performanya lebih baik daripada NetDataContractSerializer. Anda dapat mengubah informasi yang diserialisasikan di DataContractSerializer dengan menambahkan DataContractResolver ke dalamnya.

Contoh ini terdiri dari dua proyek. Proyek pertama menggunakan NetDataContractSerializer untuk membuat serial objek. Proyek kedua menggunakan DataContractSerializer dengan DataContractResolver untuk menyediakan fungsionalitas yang sama dengan proyek pertama.

Contoh kode berikut menunjukkan implementasi DataContractResolver kustom bernama MyDataContractResolver yang ditambahkan ke DataContractSerializer dalam proyek DCSwithDCR.

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

Untuk menggunakan sampel ini

  1. Dengan Visual Studio, buka file solusi DCRSample.sln.

  2. Klik kanan pada file solusi dan pilih Properti.

  3. Dalam dialog Halaman Properti Solusi, di bawah Properti Umum, Memulai Proyek, pilih Beberapa proyek untuk dimulai:.

  4. Di samping proyek DCSwithDCR, pilih Mulai dari menu dropdown Tindakan.

  5. Di samping proyek NetDCS, pilih Mulai dari menu dropdown Tindakan.

  6. Klik OK untuk menutup kotak dialog.

  7. Untuk membangun solusi, tekan Ctrl+Shift+B.

  8. Untuk menjalankan solusi, tekan Ctrl+F5.