.NET XML Serialization Helper - Clean Architecture
- β Clean Architecture design pattern
- β Interface-based abstractions
- β Multi-targeting support: .NET Framework 4.8, .NET 9.0, .NET 10.0
- β Nullable reference types support for .NET 9+
- β Comprehensive XML documentation
- β Backward compatible API
MazeNET.SerializationXml/
βββ Core/
β βββ Interfaces/
β β βββ IXmlSerializer.cs
β β βββ IXmlFileOperations.cs
β β βββ IXmlDocumentConverter.cs
β βββ Options/
β βββ XmlOptions.cs
β βββ XmlDeclarationOptions.cs
β βββ XmlOptionsBuilder.cs
βββ Infrastructure/
βββ Converters/
β βββ XmlSerializerService.cs
β βββ XmlFileOperationsService.cs
βββ Extensions/
βββ XmlExtensions.cs
Install from NUGET https://www.nuget.org/packages/MazeNET.SerializationXml/
Install-Package MazeNET.SerializationXmlOr via .NET CLI:
dotnet add package MazeNET.SerializationXmlInclude package into your project:
using MazeNET.SerializationXml;
using MazeNET.SerializationXml.Core.Interfaces;
using MazeNET.SerializationXml.Core.Options;SerializeObject to XmlDocument:
var doc = XmlConverter.SerializeObject(myObject);
// -- Serialize with config
var doc = XmlConverter.SerializeObject(myObject, builder =>
builder.RootElement("Products")
.RemoveDeclaration()
.RemoveTagCDDATA()
.RemoveSchema());
// -- OR add options with builder function:
var doc = XmlConverter.SerializeObject(myObject).Builder(builder =>
builder.RootElement("RootName")
.RemoveDeclaration()
.RemoveTagCDDATA()
.RemoveSchema());// From XML string
var myObject = XmlConverter.DeserializeObject<MyType>(xmlString);
// From XmlDocument
var myObject = XmlConverter.DeserializeObject<MyType>(xmlDocument);// Convert XmlDocument to string
var xmlString = xmlDocument.ConvertToString();
// OR chain with serialization
var xmlString = XmlConverter.SerializeObject(myObject).ConvertToString();var path = @"C:\Invoices.xml";
var doc = XmlConverter.LoadXml(path);var path = @"C:\Invoices.xml";
var data = XmlConverter.FileToObject<Invoice>(path);// Save object to file
var path = @"C:\Invoices.xml";
XmlConverter.SaveToFile(path, myObject);
// Save XmlDocument to file
var path = @"C:\Invoices.xml";
XmlConverter.SaveToFile<Invoice>(path, xmlDocument);For modern applications using dependency injection:
using MazeNET.SerializationXml.Core.Interfaces;
using MazeNET.SerializationXml.Infrastructure.Converters;
// Register in your DI container
services.AddSingleton<IXmlSerializer, XmlSerializerService>();
services.AddSingleton<IXmlFileOperations, XmlFileOperationsService>();
// Use in your classes
public class MyService
{
private readonly IXmlSerializer _xmlSerializer;
private readonly IXmlFileOperations _fileOps;
public MyService(IXmlSerializer xmlSerializer, IXmlFileOperations fileOps)
{
_xmlSerializer = xmlSerializer;
_fileOps = fileOps;
}
public void SaveData(MyData data, string path)
{
var xmlDoc = _xmlSerializer.Serialize(data);
_fileOps.SaveToFile(path, xmlDoc);
}
public MyData LoadData(string path)
{
return _fileOps.LoadFromFile<MyData>(path);
}
}RootElement(string name)- Set root element nameAddDeclaration(XmlDeclarationOptions)- Add XML declarationRemoveDeclaration(bool)- Remove XML declarationRemoveSchema(bool)- Remove XML schemaRemoveTagCDDATA(bool)- Remove CDATA tagsAddPrefix(string)- Add XML prefix
Version- XML version (default: "1.0")Encoding- XML encoding (default: UTF-8)Standalone- Standalone declaration (default: true)
If you're upgrading from CodeMazeNET.Serialization.Xml v1.x:
// Old namespace (v1.x)
using CodeMazeNET.Serialization.Xml;
// New namespace (v2.x)
using MazeNET.SerializationXml;The API remains the same, so your existing code will work with just the namespace change!
using MazeNET.SerializationXml;
using MazeNET.SerializationXml.Core.Options;
public class Invoice
{
public int Id { get; set; }
public string Customer { get; set; }
public decimal Amount { get; set; }
}
// Serialize
var invoice = new Invoice
{
Id = 1,
Customer = "John Doe",
Amount = 150.00m
};
var xmlDoc = XmlConverter.SerializeObject(invoice, builder =>
builder.RootElement("Invoice")
.RemoveSchema()
.AddDeclaration(new XmlDeclarationOptions
{
Version = "1.0",
Encoding = Encoding.UTF8,
Standalone = true
}));
// Save to file
XmlConverter.SaveToFile("invoice.xml", invoice);
// Load from file
var loadedInvoice = XmlConverter.FileToObject<Invoice>("invoice.xml");
// Deserialize from XML string
var xmlString = xmlDoc.ConvertToString();
var deserializedInvoice = XmlConverter.DeserializeObject<Invoice>(xmlString);- Separation of Concerns - Core business logic separated from infrastructure
- Testability - Easy to mock interfaces for unit testing
- Maintainability - Clear structure makes code easier to understand and modify
- Flexibility - Easy to swap implementations without changing client code
- Dependency Inversion - High-level modules don't depend on low-level modules