Karmaşık nesnelerin serileştirmesini ve seri durumdan çıkarmalarını yönetme
Karmaşık nesnelerle çalışırken, JsonSerializerOptions işleme sorunlarını önlemek için sınıf ve Veri Aktarım Nesneleri (DTO' lar) kullanılabilir. Karmaşık nesneler genellikle iç içe yapılar, özel veri türleri içerir veya serileştirme ve seri durumdan çıkarma işlemlerini etkili bir şekilde işlemek için belirli yapılandırmalar gerektirir. sınıfı, JsonSerializerOptions bu zorlukları gidermek için özelleştirilebilen çeşitli özellikler sağlar. Örneğin, özel dönüştürücüler eklemek, büyük/küçük harfe duyarsız özellik eşleştirmeyi etkinleştirmek veya null değerleri işlemek için özellikler kullanılabilir. DTO'lar ise bir uygulamanın farklı katmanları arasında veri aktarımını basitleştiren ve verilerin yapısının ve türlerinin tutarlı ve yönetilebilir olmasını sağlayan aracı nesneler görevi görür. Geliştiriciler, DTO'lardan ve DTO'lardan yararlanarak JsonSerializerOptions karmaşık JavaScript Nesne Gösterimi (JSON) verilerinin daha güvenilir ve verimli seri hale getirilmesini ve seri durumdan çıkarılmalarını sağlayarak uygulamalarıyla çalışmayı ve bunları tümleştirmeyi kolaylaştırabilir.
Karmaşık nesneleri serileştirmeye yardımcı olması için JsonSerializerOptions sınıfını kullanın
JsonSerializerOptions sınıfı ad alanının System.Text.Json bir parçasıdır ve JSON serileştirme ve seri durumdan çıkarma davranışını yapılandırmanın bir yolunu sağlar. Özelliklerin nasıl işlendiği, başvuruların nasıl yönetileceği ve özel veri türlerinin nasıl işlendiği gibi serileştirme işleminin çeşitli yönlerini özelleştirmenizi sağlar.
sınıfı JsonSerializerOptions , iç içe geçmiş yapıları, döngüsel başvuruları ve diğer serileştirme zorluklarını işlemek için seçenekler sağladığından karmaşık nesnelerle ilgilenirken kullanışlıdır.
Bu ünitede aşağıdaki özellikler gösterilmiştir:
- MaxDepth: Bu özellik, JSON okurken veya yazarken izin verilen maksimum derinliği ayarlar. Yığın taşmasına veya performans sorunlarına neden olabilecek iç içe nesnelerle ilgili sorunları önlemeye yardımcı olabilir.
- ReferenceHandler: Bu özellik, serileştirme ve seri durumdan çıkarma sırasında nesnelere yapılan başvuruların nasıl işleneceğini belirtmenize olanak tanır. Döngüsel başvurularla veya karmaşık nesne graflarıyla ilgilenirken yararlı olabilir.
Karmaşık nesneleri seri hale getirme ve seri durumdan çıkarma konusunda yardımcı olan başka bir özellik de 'dir Converters. Bu özellik, belirli türleri veya karmaşık nesneleri işlemek için özel dönüştürücüler eklemenize olanak tanır. Örneğin, iç içe nesneler veya karmaşık özellikler içeren bir sınıf için özel dönüştürücü oluşturabilirsiniz.
JsonSerializerOptions.ReferenceHandler özelliğini kullanma
ReferenceHandler özelliği, serileştirme ve seri durumdan çıkarma sırasında nesnelere yapılan başvuruların nasıl işleneceğini belirtmek için kullanılır. Bu özellikle döngüsel başvurular veya paylaşılan başvurular içerebilen karmaşık nesne graflarıyla ilgilenirken kullanışlıdır.
döngüsel başvuru, iki veya daha fazla nesne birbirine başvurduğunda oluşur ve döngü oluşturur. Örneğin, nesnesine başvuran bir nesneniz A varsa ve nesne BB nesnesine Abaşvuruda bulunursa, bu döngüsel bir başvuru oluşturur. Bu tür nesneleri seri hale getirdiğinizde, seri hale getirici bir yığın taşması hatasına yol açan sonsuz bir döngüyle karşılaşabilir.
İki sınıf arasındaki döngüsel başvuruyu gösteren aşağıdaki kod örneğini göz önünde bulundurun:
public class Person
{
public string Name { get; set; }
public List<Pet> Pets { get; set; }
}
public class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
Bu örnekte, sınıfın Person bir nesne listesi Pet vardır ve her Pet nesnenin sahibine () Personbir başvurusu vardır. Bu, nesneleri seri hale getirdiğinizde veya seri durumdan çıkarırken döngüsel başvuru oluşturur.
Nesneyi varsayılan ayarlarla seri hale getirmek Person , döngüsel başvuru nedeniyle sonuç JsonException alır. Bunu işlemek için sınıfının özelliğini ReferenceHandler kullanabilirsinizJsonSerializerOptions.
var options = new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve,
WriteIndented = true
};
var person = new Person
{
Name = "John",
Pets = new List<Pet>
{
new Pet { Name = "Fido", Owner = null },
new Pet { Name = "Whiskers", Owner = null }
}
};
person.Pets[0].Owner = person;
person.Pets[1].Owner = person;
var json = JsonSerializer.Serialize(person, options);
Console.WriteLine(json);
/*
OUTPUT (with WriteIndented = true):
{
"$id": "1",
"Name": "John",
"Pets": {
"$id": "2",
"$values": [
{
"$id": "3",
"Name": "Fido",
"Owner": {
"$ref": "1"
}
},
{
"$id": "4",
"Name": "Whiskers",
"Owner": {
"$ref": "1"
}
}
]
}
}
*/
Bu örnekte, ReferenceHandler.Preserve döngüsel başvuruları işlemek için seçeneği kullanılır. Seri hale getirici, JSON çıkışında başvuruyu temsil eden ve seri durumdan doğru şekilde çıkarılabilmesini sağlayan bir $id özellik içerir.
Seri durumdan ReferenceHandler.Preserve çıkarırken, seçenek başvuruların doğru şekilde geri yüklenmesini de sağlar ve yinelenen nesnelerin oluşturulmasını önler.
var deserializedPerson = JsonSerializer.Deserialize<Person>(json, options);
Console.WriteLine($"Name: {deserializedPerson.Name}");
foreach (var pet in deserializedPerson.Pets)
{
Console.WriteLine($"Pet Name: {pet.Name}, Owner: {pet.Owner.Name}");
}
/*
OUTPUT:
Name: John
Pet Name: Fido, Owner: John
Pet Name: Whiskers, Owner: John
*/
Bu örnekte seri durumdan çıkarılmış Person nesne, ve Person nesneleri arasındaki ilişkileri koruyarak özgün nesneyle Pet aynı başvurulara sahiptir.
Karmaşık nesneleri seri hale getirmek ve seri durumdan çıkarmak için Veri Aktarım Nesnelerini kullanma
Veri Aktarımı Nesneleri genellikle karmaşık nesneleri seri hale getirmeniz ve seri durumdan çıkarmanız gereken senaryolarda kullanılır.
DTO'lar aşağıdaki avantajları sağlar:
- Basitleştirilmiş veri yapısı: DTO'lar iç içe nesneleri düzleştirerek veya gereksiz özellikleri kaldırarak veri yapısını basitleştirebilir. Bu, karmaşık nesne graflarıyla uğraşmadan verileri seri hale getirmeyi ve seri durumdan çıkarmayı kolaylaştırır.
- Seçmeli serileştirme: DTO'lar, hangi özelliklerin serileştirilmiş çıktıya dahil olduğunu denetlemenize olanak sağlar. Bu, serileştirilmiş verilerin boyutunu azaltmaya ve performansı artırmaya yardımcı olabilir.
- Ayırma: DTO'lar veri yapısını iş mantığından ayırmak, kodu yönetmeyi ve korumayı kolaylaştırır. Bu sorun ayrımı, uygulamanın geri kalanını etkilemeden serileştirme biçimini değiştirmeyi de kolaylaştırır.
- Veri sözleşmeleri: DTO'lar, seri hale getirilmiş ve seri durumdan çıkarılmış verilerin yapısını tanımlayarak veri sözleşmeleri görevi görür. Bu, uygulamanın farklı bölümleri arasında veya farklı uygulamalar arasında tutarlılık ve uyumluluk sağlamayı kolaylaştırır.
- Birlikte çalışabilirlik: DTO'lar, veri yapısının diğer sistem veya hizmetlerle uyumlu olduğundan emin olmak için dış API'ler veya hizmetlerle tümleştirmeyi kolaylaştırabilir.
- Sürüm oluşturma: DTO'lar veri yapılarının sürümünü yönetmeye yardımcı olabilir ve mevcut istemcileri veya hizmetleri bozmadan veri modelini geliştirmenize olanak tanır.
- Güvenlik: DTO'lar, iç veri yapılarının açığa çıkarlarını sınırlayarak güvenliğin geliştirilmesine yardımcı olabilir. DTO'ları kullanarak hangi özelliklerin seri hale getirilip seri durumdan çıkarıldığını denetleyerek hassas bilgilerin açığa çıkarılması riskini azaltabilirsiniz.
- Performans: DTO'lar ağ üzerinden aktarılan veri miktarını azaltarak performansı artırmaya yardımcı olabilir. DTO'ları kullanarak yalnızca gerekli özellikleri seri hale getirerek serileştirilmiş verilerin boyutunu azaltabilir ve performansı artırabilirsiniz.
Yalnızca serileştirmek istediğiniz özellikleri içeren özel bir DTO oluşturarak nesnenin bölümlerini seçmeli olarak seri hale getirebilirsiniz. Bu yaklaşım, iç içe nesneler eklemeden tam olarak seri hale getirilenleri denetlemenize olanak tanır.
Serileştirme için DTO'ları oluşturma ve kullanma
C# dilinde serileştirme için DTO'ları oluşturma ve kullanma hakkında adım adım bir kılavuz aşağıdadır:
- DTO tanımlama: Yalnızca seri hale getirmek istediğiniz özellikleri ve yöntem sonuçlarını içeren bir sınıf oluşturun.
- Özgün nesneyi DTO ile eşleme: Özgün nesneyi DTO ile eşlemek için bir yöntem oluşturun. Bu yöntem, özgün nesneden gerekli verileri ayıklar ve DTO'yu doldurur.
- DTO'yu seri hale getirme: DTO'yu
JsonSerializerbir JSON dizesine seri hale getirmek için sınıfını kullanın. - DTO'ya seri durumdan çıkarma: JSON dizesini DTO'ya geri seri durumdan çıkarmak için sınıfını kullanın
JsonSerializer. - DTO'yu özgün nesneye geri eşleyin: DTO'yu özgün nesneye geri eşlemek için bir yöntem oluşturun. Bu yöntem, DTO'dan verileri ayıklar ve özgün nesneyi doldurur.
Aşağıdaki örnekte, karmaşık nesnelerin seri hale getirilmesi ve seri durumdan çıkarılması için DTO'ların nasıl oluşturulacağı ve kullanılacağı gösterilmektedir:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Company
{
public string Name { get; set; }
public List<Employee> Employees { get; set; }
// Constructor to initialize the Employees list
public Company(Employee employee)
{
Name = "Contoso Ltd";
Employees = new List<Employee> { employee };
}
}
public class Employee
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
public string Address { get; set; }
public string Email { get; set; }
public int EmployeeId { get; set; }
public double Salary { get; set; }
public List<Person> Dependents { get; set; }
public List<Person> EmergencyContacts { get; set; }
// Constructor to initialize the lists
public Employee()
{
Dependents = new List<Person>();
EmergencyContacts = new List<Person>();
}
}
public class EmployeeDTO
{
public string Name { get; set; }
public int EmployeeId { get; set; }
}
class Program
{
static void Main()
{
// Create an Employee object
Employee employee = new Employee
{
Name = "Elize Harmsen",
Age = 35,
Gender = "Female",
Address = "123 Main St",
Email = "elize@example.com",
EmployeeId = 101,
Salary = 75000,
Dependents = new List<Person>
{
new Person { Name = "Peter Zammit", Age = 35 }
},
EmergencyContacts = new List<Person>
{
new Person { Name = "Anette Thomsen", Age = 40 }
}
};
// Create a Company object with the Employee
Company company = new Company(employee);
// Map Employee to EmployeeDTO
EmployeeDTO employeeDTO = new EmployeeDTO
{
Name = employee.Name,
EmployeeId = employee.EmployeeId
};
// Serialize EmployeeDTO to JSON
string json = JsonSerializer.Serialize(employeeDTO);
Console.WriteLine("Serialized EmployeeDTO:");
Console.WriteLine(json);
// Deserialize JSON back to EmployeeDTO
EmployeeDTO deserializedEmployeeDTO = JsonSerializer.Deserialize<EmployeeDTO>(json);
// Use the deserialized object to create a new Employee object
Employee newEmployee = new Employee
{
Name = deserializedEmployeeDTO.Name,
EmployeeId = deserializedEmployeeDTO.EmployeeId
};
// Use the newEmployee.EmployeeId to find the original Employee object in the Company
Employee foundEmployee = company.Employees.Find(e => e.EmployeeId == newEmployee.EmployeeId);
if (foundEmployee != null)
{
Console.WriteLine("Found Employee:");
Console.WriteLine($"Name: {foundEmployee.Name}");
Console.WriteLine($"Age: {foundEmployee.Age}");
Console.WriteLine($"Gender: {foundEmployee.Gender}");
Console.WriteLine($"Email: {foundEmployee.Email}");
Console.WriteLine($"EmployeeId: {foundEmployee.EmployeeId}");
Console.WriteLine($"Salary: {foundEmployee.Salary}");
Console.WriteLine($"Dependents: {string.Join(", ", foundEmployee.Dependents.Select(d => d.Name))}");
Console.WriteLine($"Emergency Contacts: {string.Join(", ", foundEmployee.EmergencyContacts.Select(ec => ec.Name))}");
}
else
{
Console.WriteLine("Employee not found in the company.");
}
}
}
Bu örnekte sınıfı, sınıfın EmployeeDTO basitleştirilmiş bir sürümünü Employee temsil etmek için oluşturulur.
EmployeeDTO sınıfı yalnızca serileştirme için gereken özellikleri içerir. sınıfı, Employee DTO'ya dahil olmayan ek özellikler içerir.
Company sınıfı bir nesne listesi Employee içerir.
Main yöntemi bir Employee nesne oluşturmayı, nesnesiyle eşlemeyiEmployeeDTO, DTO'yı JSON'a seri hale getirmeyi ve ardından DTO'ya geri seri durumdan çıkarma işlemini gösterir. Son olarak, seri durumdan çıkarılmış DTO kullanarak içindeki Employee özgün Company nesnenin nasıl bulunacağını gösterir.
Bu yaklaşım, serileştirme işlemini denetlemenize ve karmaşık nesne graflarıyla ilgili sorunlardan kaçınmanıza olanak tanır. DTO'ları kullanarak veri yapısını basitleştirebilir ve serileştirilmiş çıktıya yalnızca gerekli özelliklerin dahil edilmesini sağlayabilirsiniz.
Özet
Bu ünitede, sınıfını ve Veri Aktarım Nesnelerini (DTO) kullanarak karmaşık nesnelerin seri hale getirilmesini ve seri durumdan çıkarılmasının JsonSerializerOptions nasıl yönetileceğini öğrendiniz.
JsonSerializerOptions sınıfı, , MaxDepthve ReferenceHandlergibi Converterskarmaşık nesneleri işlemek için özelleştirilebilen çeşitli özellikler sağlar.
ReferenceHandler özelliği özellikle karmaşık nesnelerdeki döngüsel başvuruları işlemek için kullanışlıdır. DTO'lar, bir uygulamanın farklı katmanları arasında veri aktarımını basitleştiren ve hangi özelliklerin serileştirilmiş çıktıya dahil olduğunu denetlemenize olanak tanıyan aracı nesnelerdir. Bu tekniklerden yararlanarak, karmaşık JSON verilerinin daha güvenilir ve verimli seri hale getirilmesini ve seri durumdan çıkarılarak uygulamalarınızla çalışmayı ve bunları tümleştirmeyi kolaylaştırabilirsiniz.