Ecng.Serialization 1.0.318

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Serialization --version 1.0.318
                    
NuGet\Install-Package Ecng.Serialization -Version 1.0.318
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ecng.Serialization" Version="1.0.318" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Serialization" Version="1.0.318" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.Serialization" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.Serialization --version 1.0.318
                    
#r "nuget: Ecng.Serialization, 1.0.318"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ecng.Serialization@1.0.318
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.Serialization&version=1.0.318
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Serialization&version=1.0.318
                    
Install as a Cake Tool

Ecng.Serialization

A comprehensive serialization library providing JSON serialization and high-performance binary primitives for .NET applications.

Table of Contents

Overview

Ecng.Serialization provides a flexible and efficient serialization framework with the following key features:

  • JSON Serialization: Full-featured JSON serializer with customizable settings
  • Binary Primitives: High-performance SpanWriter and SpanReader for compact binary formats
  • SettingsStorage: Dictionary-based storage system for application settings
  • IPersistable Pattern: Interface-based serialization for custom types
  • Async Support: Asynchronous serialization methods with cancellation token support
  • Extension Methods: Convenient helpers for common serialization tasks

Installation

Add a reference to the Ecng.Serialization assembly in your project.

<PackageReference Include="Ecng.Serialization" Version="x.x.x" />

Quick Start

JSON Serialization

using Ecng.Serialization;

// Create a JSON serializer with default settings
var serializer = JsonSerializer<MyData>.CreateDefault();

// Serialize to file
await using var stream = File.OpenWrite("data.json");
await serializer.SerializeAsync(data, stream, CancellationToken.None);

// Deserialize from file
await using var readStream = File.OpenRead("data.json");
var loaded = await serializer.DeserializeAsync(readStream, CancellationToken.None);

Binary Primitives

using Ecng.Serialization;

// Write binary data
SpanWriter writer = stackalloc byte[256];
writer.WriteInt32(42);
writer.WriteString("hello");
writer.WriteDateTime(DateTime.UtcNow);

// Read binary data
var reader = new SpanReader(writer.GetWrittenSpan());
int number = reader.ReadInt32();
string text = reader.ReadString(5, Encoding.UTF8);
DateTime timestamp = reader.ReadDateTime();

SettingsStorage

using Ecng.Serialization;

// Create and populate settings
var settings = new SettingsStorage();
settings.Set("Host", "localhost");
settings.Set("Port", 8080);
settings.Set("Timeout", TimeSpan.FromSeconds(30));

// Serialize to JSON string
var serializer = JsonSerializer<SettingsStorage>.CreateDefault();
string json = serializer.SaveToString(settings);

// Deserialize from JSON string
var restored = serializer.LoadFromString(json);
string host = restored.GetValue<string>("Host");
int port = restored.GetValue<int>("Port");

Core Concepts

ISerializer Interface

The ISerializer<T> interface is the foundation of the serialization framework:

public interface ISerializer<T>
{
    string FileExtension { get; }
    ValueTask SerializeAsync(T graph, Stream stream, CancellationToken cancellationToken);
    ValueTask<T> DeserializeAsync(Stream stream, CancellationToken cancellationToken);
}

All serializers implement this interface, providing consistent API across different formats.

JSON Serialization

Creating a JSON Serializer

// Default configuration (indented, enums as strings, ignore null values)
var serializer = JsonSerializer<MyClass>.CreateDefault();

// Custom configuration
var customSerializer = new JsonSerializer<MyClass>
{
    Indent = true,                    // Pretty-print JSON
    EnumAsString = true,              // Serialize enums as strings
    NullValueHandling = NullValueHandling.Ignore,  // Omit null values
    Encoding = Encoding.UTF8,         // Text encoding
    BufferSize = 4096                 // Buffer size for I/O
};

JSON Serializer Settings

Property Type Default Description
Indent bool false Format JSON with indentation
EnumAsString bool false Serialize enums as strings instead of numbers
NullValueHandling NullValueHandling Include How to handle null values
Encoding Encoding UTF8 Text encoding for serialization
BufferSize int 1024 Buffer size for stream operations
FillMode bool true Enable fill mode for IPersistable objects
EncryptedAsByteArray bool false Serialize SecureString as byte array

Serialization Examples

Async File Serialization
var serializer = JsonSerializer<OrderBook>.CreateDefault();

// Save to file
await using var file = File.OpenWrite("orderbook.json");
await serializer.SerializeAsync(orderBook, file, CancellationToken.None);

// Load from file
await using var input = File.OpenRead("orderbook.json");
var orderBook = await serializer.DeserializeAsync(input, CancellationToken.None);
Synchronous Serialization
var serializer = JsonSerializer<MyData>.CreateDefault();

// Serialize to byte array
byte[] data = serializer.Serialize(myObject);

// Deserialize from byte array
var restored = serializer.Deserialize(data);

// Serialize to file
serializer.Serialize(myObject, "output.json");

// Deserialize from file
var loaded = serializer.Deserialize("output.json");
String Serialization
var serializer = JsonSerializer<SettingsStorage>.CreateDefault();

// Serialize to string
string json = serializer.SaveToString(settings);

// Deserialize from string
var settings = serializer.LoadFromString(json);

Supported Types

The JSON serializer supports:

  • Primitives: int, long, double, decimal, bool, string, etc.
  • Date/Time: DateTime, DateTimeOffset, TimeSpan
  • Collections: Arrays, List<T>, IEnumerable<T>
  • Special Types: Guid, byte[], SecureString, TimeZoneInfo, Type
  • Custom Types: Types implementing IPersistable or IAsyncPersistable
  • SettingsStorage: Native support for settings dictionary

Binary Serialization

SpanWriter - Writing Binary Data

SpanWriter is a high-performance ref struct for writing primitive types to a span of bytes.

// Allocate buffer on stack
SpanWriter writer = stackalloc byte[1024];

// Write primitive types
writer.WriteByte(255);
writer.WriteSByte(-128);
writer.WriteBoolean(true);
writer.WriteInt16(short.MaxValue);
writer.WriteUInt16(ushort.MaxValue);
writer.WriteInt32(42);
writer.WriteUInt32(100u);
writer.WriteInt64(long.MaxValue);
writer.WriteUInt64(ulong.MaxValue);
writer.WriteSingle(3.14f);
writer.WriteDouble(2.718281828);
writer.WriteDecimal(1234.5678m);

// Write date/time types
writer.WriteDateTime(DateTime.UtcNow);
writer.WriteTimeSpan(TimeSpan.FromHours(1));

// Write strings (requires encoding)
writer.WriteString("Hello, World!", Encoding.UTF8);

// Write GUID
writer.WriteGuid(Guid.NewGuid());

// Write character
writer.WriteChar('A');

// Get written data
ReadOnlySpan<byte> data = writer.GetWrittenSpan();
int bytesWritten = writer.Position;
Big-Endian / Little-Endian
// Little-endian (default, Intel x86/x64)
SpanWriter writerLE = stackalloc byte[256];
writerLE.WriteInt32(0x12345678);  // Bytes: 78 56 34 12

// Big-endian (network byte order)
SpanWriter writerBE = new SpanWriter(buffer, isBigEndian: true);
writerBE.WriteInt32(0x12345678);  // Bytes: 12 34 56 78
Advanced SpanWriter Usage
byte[] buffer = new byte[1024];
var writer = new SpanWriter(buffer);

// Skip bytes (advance position without writing)
writer.Skip(16);

// Write span of bytes directly
ReadOnlySpan<byte> source = stackalloc byte[] { 1, 2, 3, 4, 5 };
writer.WriteSpan(source);

// Write structures (value types)
var header = new PacketHeader { Version = 1, Length = 100 };
writer.WriteStruct(header, Marshal.SizeOf<PacketHeader>());

// Check remaining space
if (!writer.IsFull)
{
    int remaining = writer.Remaining;
    // Write more data
}

// Get position
int currentPos = writer.Position;

SpanReader - Reading Binary Data

SpanReader is a high-performance ref struct for reading primitive types from a span of bytes.

ReadOnlySpan<byte> data = /* your binary data */;
var reader = new SpanReader(data);

// Read primitive types (must match write order)
byte b = reader.ReadByte();
sbyte sb = reader.ReadSByte();
bool flag = reader.ReadBoolean();
short s = reader.ReadInt16();
ushort us = reader.ReadUInt16();
int i = reader.ReadInt32();
uint ui = reader.ReadUInt32();
long l = reader.ReadInt64();
ulong ul = reader.ReadUInt64();
float f = reader.ReadSingle();
double d = reader.ReadDouble();
decimal dec = reader.ReadDecimal();

// Read date/time types
DateTime dt = reader.ReadDateTime();
TimeSpan ts = reader.ReadTimeSpan();

// Read string (must know length)
string text = reader.ReadString(13, Encoding.UTF8);

// Read GUID
Guid id = reader.ReadGuid();

// Read character
char c = reader.ReadChar();

// Check if end of span
if (!reader.End)
{
    int remaining = reader.Remaining;
    // Read more data
}
Advanced SpanReader Usage
var reader = new SpanReader(binaryData);

// Skip bytes
reader.Skip(16);

// Read span of bytes
ReadOnlySpan<byte> chunk = reader.ReadSpan(256);

// Read structure
var header = reader.ReadStruct<PacketHeader>(Marshal.SizeOf<PacketHeader>());

// Read array of structures
var items = new Item[10];
reader.ReadStructArray(items, Marshal.SizeOf<Item>(), 10);

// Get current position
int position = reader.Position;

// Check if at end
bool isEnd = reader.End;
int bytesLeft = reader.Remaining;

Binary Serialization Example

public class BinarySerializer
{
    public byte[] Serialize(TradeData trade)
    {
        byte[] buffer = new byte[256];
        var writer = new SpanWriter(buffer);

        writer.WriteInt64(trade.Id);
        writer.WriteDecimal(trade.Price);
        writer.WriteDecimal(trade.Volume);
        writer.WriteDateTime(trade.Timestamp);
        writer.WriteInt32(trade.Direction);

        return buffer[..writer.Position];
    }

    public TradeData Deserialize(byte[] data)
    {
        var reader = new SpanReader(data);

        return new TradeData
        {
            Id = reader.ReadInt64(),
            Price = reader.ReadDecimal(),
            Volume = reader.ReadDecimal(),
            Timestamp = reader.ReadDateTime(),
            Direction = reader.ReadInt32()
        };
    }
}

SettingsStorage

SettingsStorage is a thread-safe dictionary for storing configuration and settings.

Basic Usage

var settings = new SettingsStorage();

// Set values (fluent API)
settings.Set("ServerUrl", "https://api.example.com")
        .Set("Port", 8080)
        .Set("EnableLogging", true)
        .Set("Timeout", TimeSpan.FromSeconds(30))
        .Set("MaxRetries", 3);

// Get values with type safety
string url = settings.GetValue<string>("ServerUrl");
int port = settings.GetValue<int>("Port");
bool logging = settings.GetValue<bool>("EnableLogging");

// Get values with default
int retries = settings.GetValue("MaxRetries", defaultValue: 5);
string missing = settings.GetValue("NotFound", defaultValue: "default");

// Check if key exists
if (settings.Contains("ServerUrl"))
{
    // Key exists
}

// Get all setting names
IEnumerable<string> names = settings.Names;

Nested Settings

var settings = new SettingsStorage();

// Create nested settings
var database = new SettingsStorage()
    .Set("Host", "localhost")
    .Set("Port", 5432)
    .Set("Database", "myapp");

var logging = new SettingsStorage()
    .Set("Level", "Info")
    .Set("FilePath", "logs/app.log");

settings.Set("Database", database)
        .Set("Logging", logging);

// Retrieve nested settings
var dbSettings = settings.GetValue<SettingsStorage>("Database");
string dbHost = dbSettings.GetValue<string>("Host");

// Or retrieve specific nested value
var logSettings = settings.GetValue<SettingsStorage>("Logging");
string logLevel = logSettings.GetValue<string>("Level");

Async Value Retrieval

var settings = new SettingsStorage();

// Async get with cancellation token
string value = await settings.GetValueAsync<string>(
    "ServerUrl",
    defaultValue: "https://default.com",
    cancellationToken: CancellationToken.None
);

Serializing SettingsStorage

var settings = new SettingsStorage()
    .Set("AppName", "MyApp")
    .Set("Version", "1.0.0");

// Serialize to JSON
var serializer = JsonSerializer<SettingsStorage>.CreateDefault();
string json = serializer.SaveToString(settings);

// Output:
// {
//   "AppName": "MyApp",
//   "Version": "1.0.0"
// }

// Deserialize from JSON
var restored = serializer.LoadFromString(json);

IPersistable Interface

The IPersistable interface enables custom serialization for your types.

Implementing IPersistable

public class TradingStrategy : IPersistable
{
    public string Name { get; set; }
    public decimal StopLoss { get; set; }
    public decimal TakeProfit { get; set; }
    public int MaxPositions { get; set; }
    public TimeSpan HoldingPeriod { get; set; }

    public void Load(SettingsStorage storage)
    {
        Name = storage.GetValue<string>(nameof(Name));
        StopLoss = storage.GetValue<decimal>(nameof(StopLoss));
        TakeProfit = storage.GetValue<decimal>(nameof(TakeProfit));
        MaxPositions = storage.GetValue<int>(nameof(MaxPositions));
        HoldingPeriod = storage.GetValue<TimeSpan>(nameof(HoldingPeriod));
    }

    public void Save(SettingsStorage storage)
    {
        storage.Set(nameof(Name), Name)
               .Set(nameof(StopLoss), StopLoss)
               .Set(nameof(TakeProfit), TakeProfit)
               .Set(nameof(MaxPositions), MaxPositions)
               .Set(nameof(HoldingPeriod), HoldingPeriod);
    }
}

Using IPersistable Objects

var strategy = new TradingStrategy
{
    Name = "Momentum",
    StopLoss = 0.02m,
    TakeProfit = 0.05m,
    MaxPositions = 10,
    HoldingPeriod = TimeSpan.FromHours(24)
};

// Save to SettingsStorage
var settings = strategy.Save();

// Serialize to JSON
var serializer = JsonSerializer<TradingStrategy>.CreateDefault();
await using var file = File.OpenWrite("strategy.json");
await serializer.SerializeAsync(strategy, file, CancellationToken.None);

// Deserialize from JSON
await using var input = File.OpenRead("strategy.json");
var loaded = await serializer.DeserializeAsync(input, CancellationToken.None);

// Clone an object
var clone = strategy.Clone();

// Apply state from one object to another
var newStrategy = new TradingStrategy();
newStrategy.Apply(strategy);

IAsyncPersistable Interface

For asynchronous serialization scenarios:

public class AsyncDataLoader : IAsyncPersistable
{
    public string ConnectionString { get; set; }
    public List<string> LoadedData { get; set; }

    public async Task LoadAsync(SettingsStorage storage, CancellationToken cancellationToken)
    {
        ConnectionString = storage.GetValue<string>(nameof(ConnectionString));

        // Perform async operations
        await Task.Delay(100, cancellationToken);

        var data = storage.GetValue<string[]>(nameof(LoadedData));
        LoadedData = new List<string>(data);
    }

    public async Task SaveAsync(SettingsStorage storage, CancellationToken cancellationToken)
    {
        storage.Set(nameof(ConnectionString), ConnectionString);

        // Perform async operations
        await Task.Delay(100, cancellationToken);

        storage.Set(nameof(LoadedData), LoadedData.ToArray());
    }
}

IPersistable Helper Methods

// Save to SettingsStorage
SettingsStorage settings = myObject.Save();

// Load from SettingsStorage
var obj = new MyClass();
obj.Load(settings);

// Load typed object
var typed = settings.Load<MyClass>();

// Save entire object with type information
var storage = myObject.SaveEntire(isAssemblyQualifiedName: false);

// Load entire object with type creation
var restored = storage.LoadEntire<IPersistable>();

// Clone
var clone = myObject.Clone();

// Async clone
var asyncClone = await myAsyncObject.CloneAsync(CancellationToken.None);

// Apply state from clone
myObject.Apply(clone);

// Async apply
await myAsyncObject.ApplyAsync(clone, CancellationToken.None);

Extension Methods

ISerializer Extensions

var serializer = JsonSerializer<MyData>.CreateDefault();

// Synchronous serialization
byte[] data = serializer.Serialize(myObject);
serializer.Serialize(myObject, "output.json");
serializer.Serialize(myObject, stream);

// Synchronous deserialization
var obj1 = serializer.Deserialize(data);
var obj2 = serializer.Deserialize("input.json");
var obj3 = serializer.Deserialize(stream);

// String serialization
string json = serializer.SaveToString(myObject);
var restored = serializer.LoadFromString(json);

JSON Helper Methods

using Ecng.Serialization;

// Serialize to JSON string
string json = myObject.ToJson(indent: true);

// Deserialize from JSON string
var obj = json.DeserializeObject<MyClass>();

// Create JSON serializer settings
var settings = JsonHelper.CreateJsonSerializerSettings();

// Skip BOM from byte array
byte[] cleanData = jsonBytes.SkipBom();

// Skip BOM from string
string cleanJson = jsonString.SkipBom();

Advanced Features

Custom Serializers

Register custom serializers for specific types:

// Register custom serializer
PersistableHelper.RegisterCustomSerializer<MyType>(
    serialize: obj =>
    {
        var storage = new SettingsStorage();
        storage.Set("CustomField", obj.CustomProperty);
        return storage;
    },
    deserialize: storage =>
    {
        return new MyType
        {
            CustomProperty = storage.GetValue<string>("CustomField")
        };
    }
);

// Use custom serializer
MyType obj = new MyType { CustomProperty = "value" };
if (obj.TrySerialize(out var storage))
{
    // Custom serialization succeeded
}

if (storage.TryDeserialize<MyType>(out var deserialized))
{
    // Custom deserialization succeeded
}

// Unregister custom serializer
PersistableHelper.UnRegisterCustomSerializer<MyType>();

Type Adapters

Register adapters for non-persistable types:

// Register adapter for a type
typeof(MyType).RegisterAdapterType(typeof(MyTypeAdapter));

// Remove adapter
typeof(MyType).RemoveAdapterType();

// Check if adapter exists
if (typeof(MyType).TryGetAdapterType(out Type adapterType))
{
    // Adapter registered
}

Adapter Implementation

public class MyTypeAdapter : IPersistable, IPersistableAdapter
{
    public object UnderlyingValue { get; set; }

    public void Load(SettingsStorage storage)
    {
        var myType = new MyType
        {
            Property = storage.GetValue<string>("Property")
        };
        UnderlyingValue = myType;
    }

    public void Save(SettingsStorage storage)
    {
        var myType = (MyType)UnderlyingValue;
        storage.Set("Property", myType.Property);
    }
}

Tuple Serialization

// Convert tuple to storage
var pair = new RefPair<int, string> { First = 42, Second = "hello" };
var storage = pair.ToStorage();

// Convert storage to tuple
var restored = storage.ToRefPair<int, string>();

// Also supports RefTriple, RefQuadruple, RefFive
var triple = new RefTriple<int, string, bool>
{
    First = 1,
    Second = "two",
    Third = true
};
var tripleStorage = triple.ToStorage();
var restoredTriple = tripleStorage.ToRefTriple<int, string, bool>();

MemberInfo Serialization

using System.Reflection;

// Serialize MemberInfo
MethodInfo method = typeof(MyClass).GetMethod("MyMethod");
var storage = method.ToStorage(isAssemblyQualifiedName: false);

// Deserialize MemberInfo
var restored = storage.ToMember<MethodInfo>();

// Also works with Type, PropertyInfo, FieldInfo, etc.
Type type = typeof(MyClass);
var typeStorage = type.ToStorage();
var restoredType = typeStorage.ToMember<Type>();

Object Serialization

// Serialize any object to storage
object value = 42;
var storage = value.ToStorage(isAssemblyQualifiedName: false);

// Deserialize from storage
object restored = storage.FromStorage();

// Works with IPersistable objects too
var persistable = new MyPersistableClass();
var objStorage = persistable.ToStorage();
var objRestored = objStorage.FromStorage();

Conditional Loading

var obj = new MyPersistableClass();

// Load only if storage is not null
bool loaded = obj.LoadIfNotNull(settings, "MyKey");

// Load from nested setting if exists
if (obj.LoadIfNotNull(settings.GetValue<SettingsStorage>("Nested")))
{
    // Successfully loaded from nested settings
}

File Extension

var serializer = JsonSerializer<MyData>.CreateDefault();

// Get file extension for the format
string ext = serializer.FileExtension;  // Returns "json"

// Use in file operations
string fileName = $"data.{serializer.FileExtension}";

Best Practices

1. Use CreateDefault() for JSON

// Good: Uses sensible defaults (indent, enums as strings, ignore nulls)
var serializer = JsonSerializer<MyData>.CreateDefault();

// Avoid: Manual configuration unless you need specific settings
var serializer = new JsonSerializer<MyData>
{
    Indent = true,
    EnumAsString = true,
    NullValueHandling = NullValueHandling.Ignore
};

2. Prefer Async Methods

// Good: Async for I/O operations
await serializer.SerializeAsync(data, stream, cancellationToken);

// Avoid: Sync methods for file/network I/O
serializer.Serialize(data, stream);  // Only for in-memory streams

3. Use IPersistable for Domain Objects

// Good: Explicit control over serialization
public class Order : IPersistable
{
    public void Load(SettingsStorage storage) { /* ... */ }
    public void Save(SettingsStorage storage) { /* ... */ }
}

// Avoid: Relying on reflection for complex objects

4. Dispose Streams Properly

// Good: Using statement ensures disposal
await using var stream = File.OpenRead("data.json");
var data = await serializer.DeserializeAsync(stream, cancellationToken);

// Avoid: Manual disposal
var stream = File.OpenRead("data.json");
try
{
    var data = await serializer.DeserializeAsync(stream, cancellationToken);
}
finally
{
    stream.Dispose();
}

5. Stack Allocation for Binary

// Good: Stack allocation for small buffers
SpanWriter writer = stackalloc byte[256];
writer.WriteInt32(42);

// Avoid: Heap allocation unless necessary
byte[] buffer = new byte[256];
var writer = new SpanWriter(buffer);

Performance Considerations

Binary Serialization

  • SpanWriter and SpanReader use stack allocation for maximum performance
  • Zero allocation for primitives when using stackalloc
  • No boxing/unboxing
  • Direct memory access

JSON Serialization

  • Configurable buffer sizes for optimal I/O
  • Async methods prevent thread blocking
  • Streaming API for large files
  • Efficient enum handling

SettingsStorage

  • Thread-safe dictionary implementation
  • Case-insensitive key lookup
  • Lazy type conversion
  • Minimal allocations

Error Handling

try
{
    var serializer = JsonSerializer<MyData>.CreateDefault();
    var data = await serializer.DeserializeAsync(stream, cancellationToken);
}
catch (JsonException ex)
{
    // JSON parsing error
    Console.WriteLine($"Invalid JSON: {ex.Message}");
}
catch (InvalidOperationException ex)
{
    // Serialization logic error
    Console.WriteLine($"Serialization error: {ex.Message}");
}
catch (OperationCanceledException)
{
    // Operation was cancelled
    Console.WriteLine("Operation cancelled");
}

Thread Safety

  • SettingsStorage is thread-safe
  • JsonSerializer<T> instances are thread-safe for concurrent reads
  • SpanWriter and SpanReader are ref structs and not thread-safe (use on stack)

License

See the main StockSharp repository for licensing information.

Contributing

Contributions are welcome! Please submit pull requests to the main StockSharp repository.

Support

For issues and questions, please use the StockSharp issue tracker or community forums.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Ecng.Serialization:

Package Downloads
Ecng.ComponentModel

Ecng system framework

Ecng.Interop.Windows

Ecng system framework

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.326 0 1/14/2026
1.0.325 47 1/13/2026
1.0.324 71 1/13/2026
1.0.323 514 1/9/2026
1.0.322 337 1/9/2026
1.0.321 292 1/8/2026
1.0.320 2,195 1/4/2026
1.0.319 538 1/1/2026
1.0.318 497 12/31/2025
1.0.317 494 12/30/2025
1.0.316 486 12/30/2025
1.0.315 507 12/29/2025
1.0.314 922 12/26/2025
1.0.313 518 12/26/2025
1.0.312 508 12/26/2025
1.0.311 523 12/26/2025
1.0.310 597 12/25/2025
1.0.309 601 12/25/2025
1.0.308 1,109 12/22/2025
1.0.307 611 12/21/2025
1.0.306 657 12/19/2025
1.0.305 646 12/19/2025
1.0.304 848 12/17/2025
1.0.303 884 12/15/2025
1.0.302 643 12/15/2025
1.0.301 624 12/14/2025
1.0.300 1,702 12/12/2025
1.0.299 893 12/12/2025
1.0.298 494 12/12/2025
1.0.297 511 12/12/2025
1.0.296 879 12/12/2025
1.0.295 1,214 12/2/2025
1.0.294 1,091 12/2/2025
1.0.293 1,092 12/2/2025
1.0.292 700 11/30/2025
1.0.291 557 11/29/2025
1.0.290 556 11/28/2025
1.0.289 540 11/28/2025
1.0.288 632 11/27/2025
1.0.287 714 11/24/2025
1.0.286 617 11/24/2025
1.0.285 633 11/23/2025
1.0.284 610 11/23/2025
1.0.283 668 11/22/2025
1.0.282 1,658 11/20/2025
1.0.281 890 11/18/2025
1.0.280 824 11/18/2025
1.0.279 851 11/13/2025
1.0.278 750 11/10/2025
1.0.277 1,632 11/1/2025
1.0.276 864 10/28/2025
1.0.275 848 10/27/2025
1.0.274 691 10/27/2025
1.0.273 612 10/25/2025
1.0.272 2,345 10/11/2025
1.0.271 2,047 10/3/2025
1.0.270 2,067 9/28/2025
1.0.269 755 9/25/2025
1.0.268 5,439 9/2/2025
1.0.267 3,173 8/30/2025
1.0.266 806 8/30/2025
1.0.265 1,669 8/19/2025
1.0.264 682 8/15/2025
1.0.263 5,524 7/16/2025
1.0.262 1,986 7/13/2025
1.0.261 629 7/13/2025
1.0.260 631 7/12/2025
1.0.259 1,881 7/8/2025
1.0.258 1,403 7/4/2025
1.0.257 684 7/2/2025
1.0.256 5,442 6/16/2025
1.0.255 826 6/9/2025
1.0.254 714 6/8/2025
1.0.253 2,318 5/21/2025
1.0.252 841 5/17/2025
1.0.251 2,374 5/12/2025
1.0.250 741 5/12/2025
1.0.249 661 5/11/2025
1.0.248 641 5/11/2025
1.0.247 593 5/10/2025
1.0.246 598 5/10/2025
1.0.245 1,341 4/17/2025
1.0.244 735 4/15/2025
1.0.243 670 4/12/2025
1.0.242 4,825 3/22/2025
1.0.241 694 3/20/2025
1.0.240 655 3/20/2025
1.0.239 681 3/19/2025
1.0.238 5,596 2/26/2025
1.0.237 735 2/26/2025
1.0.236 9,184 2/5/2025
1.0.235 4,512 1/21/2025
1.0.234 709 1/20/2025
1.0.233 578 1/20/2025
1.0.232 703 1/19/2025
1.0.231 2,294 1/14/2025
1.0.230 1,065 1/12/2025
1.0.229 653 1/12/2025
1.0.228 664 1/12/2025
1.0.227 803 1/12/2025
1.0.226 1,297 1/10/2025
1.0.225 4,795 12/27/2024
1.0.224 679 12/19/2024
1.0.223 1,148 11/20/2024
1.0.222 4,104 11/18/2024
1.0.221 2,520 11/7/2024
1.0.220 1,076 10/31/2024
1.0.219 973 10/19/2024
1.0.218 3,792 10/12/2024
1.0.217 1,358 10/9/2024
1.0.216 3,790 10/5/2024
1.0.215 5,413 9/18/2024
1.0.214 709 9/17/2024
1.0.213 5,017 9/3/2024
1.0.212 711 9/1/2024
1.0.211 4,518 8/8/2024
1.0.210 11,176 6/12/2024
1.0.209 3,486 5/28/2024
1.0.208 4,318 5/4/2024
1.0.207 2,957 4/23/2024
1.0.206 2,052 4/21/2024
1.0.205 891 4/14/2024
1.0.204 6,265 3/28/2024
1.0.203 827 3/17/2024
1.0.202 4,123 2/23/2024
1.0.201 738 2/23/2024
1.0.200 4,067 2/18/2024
1.0.199 724 2/18/2024
1.0.198 799 2/16/2024
1.0.197 2,835 2/13/2024
1.0.196 2,636 2/8/2024
1.0.195 3,019 2/5/2024
1.0.194 737 2/4/2024
1.0.193 3,140 1/23/2024
1.0.192 717 1/23/2024
1.0.191 2,491 1/12/2024
1.0.190 5,770 1/2/2024
1.0.189 880 12/29/2023
1.0.188 5,530 12/15/2023
1.0.187 1,184 12/15/2023
1.0.186 1,241 12/13/2023
1.0.185 806 12/13/2023
1.0.184 12,363 11/12/2023
1.0.183 1,329 11/10/2023
1.0.182 876 11/10/2023
1.0.181 1,131 11/9/2023
1.0.180 1,937 11/3/2023
1.0.179 861 11/1/2023
1.0.178 918 11/1/2023
1.0.177 26,099 9/8/2023
1.0.176 1,280 9/8/2023
1.0.175 1,443 9/3/2023
1.0.174 1,723 8/21/2023
1.0.173 1,352 8/15/2023
1.0.172 915 8/14/2023
1.0.171 904 8/14/2023
1.0.170 1,506 8/10/2023
1.0.169 40,910 7/1/2023
1.0.168 1,068 6/29/2023
1.0.167 16,439 5/27/2023
1.0.166 1,383 5/21/2023
1.0.165 1,532 5/19/2023
1.0.164 26,818 5/8/2023
1.0.163 3,676 5/1/2023
1.0.162 2,793 4/22/2023
1.0.161 1,359 4/21/2023
1.0.160 51,973 4/3/2023
1.0.159 3,209 3/27/2023
1.0.158 2,766 3/21/2023
1.0.157 3,564 3/13/2023
1.0.156 20,132 3/6/2023
1.0.155 2,448 2/26/2023
1.0.154 17,290 2/21/2023
1.0.153 1,568 2/20/2023
1.0.152 2,956 2/15/2023
1.0.151 1,568 2/14/2023
1.0.150 33,977 2/9/2023
1.0.149 18,104 2/7/2023
1.0.148 2,204 2/4/2023
1.0.147 22,309 2/2/2023
1.0.146 18,489 1/30/2023
1.0.145 7,433 1/18/2023
1.0.144 45,925 12/30/2022
1.0.143 3,391 12/23/2022
1.0.142 22,923 12/12/2022
1.0.141 25,519 12/4/2022
1.0.140 2,437 12/4/2022
1.0.139 3,173 11/30/2022
1.0.138 2,432 11/29/2022
1.0.137 2,465 11/28/2022
1.0.136 6,720 11/18/2022
1.0.135 29,663 11/11/2022
1.0.134 2,427 11/11/2022
1.0.133 2,431 11/10/2022
1.0.132 2,672 11/5/2022
1.0.131 3,999 11/4/2022
1.0.130 26,559 11/1/2022
1.0.129 27,021 10/16/2022
1.0.128 9,665 9/10/2022
1.0.127 53,628 9/8/2022
1.0.126 2,857 9/8/2022
1.0.125 2,810 9/8/2022
1.0.124 2,804 9/4/2022
1.0.123 2,858 9/4/2022
1.0.122 93,150 8/24/2022
1.0.121 9,778 8/8/2022
1.0.120 3,044 8/8/2022
1.0.119 6,224 7/26/2022
1.0.118 3,289 7/26/2022
1.0.117 56,376 7/19/2022
1.0.116 48,641 7/18/2022
1.0.115 8,446 7/8/2022
1.0.114 7,561 6/18/2022
1.0.113 3,291 6/6/2022
1.0.112 100,527 4/30/2022
1.0.111 3,616 4/20/2022
1.0.110 3,593 4/10/2022
1.0.109 3,477 4/7/2022
1.0.108 3,474 4/7/2022
1.0.107 3,594 4/2/2022
1.0.106 15,154 3/29/2022
1.0.105 3,475 3/27/2022
1.0.104 3,502 3/27/2022
1.0.103 292,750 1/24/2022
1.0.102 165,216 12/29/2021
1.0.101 31,388 12/20/2021
1.0.100 4,017 12/13/2021
1.0.99 31,805 12/7/2021
1.0.98 30,574 12/6/2021
1.0.97 2,201 12/6/2021
1.0.96 3,987 12/2/2021
1.0.95 32,120 11/29/2021
1.0.94 30,932 11/22/2021
1.0.93 2,293 11/17/2021
1.0.92 2,236 11/14/2021
1.0.91 31,067 11/13/2021
1.0.90 2,310 11/11/2021
1.0.89 2,266 11/11/2021
1.0.88 2,321 11/10/2021
1.0.87 2,418 11/9/2021
1.0.86 65,372 11/5/2021
1.0.85 2,424 11/5/2021
1.0.84 2,388 11/4/2021
1.0.83 2,271 11/4/2021
1.0.82 2,277 11/3/2021
1.0.81 2,440 10/30/2021
1.0.80 33,948 10/21/2021
1.0.79 2,909 10/17/2021
1.0.78 64,344 10/14/2021
1.0.77 13,806 10/13/2021
1.0.76 2,439 10/12/2021
1.0.75 34,442 10/11/2021
1.0.74 2,278 10/9/2021
1.0.73 37,715 10/7/2021
1.0.72 39,763 10/7/2021
1.0.71 2,368 10/7/2021
1.0.70 2,379 10/6/2021
1.0.69 2,406 9/28/2021
1.0.68 36,724 9/23/2021
1.0.67 2,579 9/11/2021
1.0.66 2,079 9/10/2021
1.0.65 2,096 9/9/2021
1.0.64 2,043 9/8/2021
1.0.63 2,044 9/8/2021
1.0.62 33,454 9/6/2021
1.0.61 2,259 8/31/2021
1.0.60 2,235 8/30/2021
1.0.59 36,287 7/31/2021
1.0.58 62,885 7/30/2021
1.0.57 2,730 7/26/2021
1.0.56 93,000 7/5/2021
1.0.55 2,624 7/1/2021
1.0.54 66,022 6/4/2021
1.0.53 94,537 4/26/2021
1.0.52 33,878 4/19/2021
1.0.51 154,200 4/7/2021
1.0.50 33,223 4/3/2021
1.0.49 183,343 3/22/2021
1.0.48 116,274 3/4/2021
1.0.47 36,206 2/26/2021
1.0.46 171,895 2/2/2021
1.0.45 60,325 1/26/2021
1.0.44 59,650 1/24/2021
1.0.43 2,882 1/24/2021
1.0.42 3,046 1/23/2021
1.0.41 61,035 1/20/2021
1.0.40 3,026 1/20/2021
1.0.39 31,745 1/18/2021
1.0.38 2,951 1/18/2021
1.0.37 30,771 1/16/2021
1.0.36 121,943 12/16/2020
1.0.35 58,608 12/14/2020
1.0.34 36,183 12/9/2020
1.0.33 5,321 12/6/2020
1.0.32 3,507 12/2/2020
1.0.31 3,390 12/2/2020
1.0.30 31,815 12/1/2020
1.0.29 189,242 11/12/2020
1.0.29-atestpub 1,609 11/11/2020
1.0.28 32,961 10/11/2020
1.0.27 114,872 9/9/2020
1.0.26 31,376 9/3/2020
1.0.25 31,942 8/20/2020
1.0.24 87,570 8/9/2020
1.0.23 32,182 7/28/2020
1.0.22 31,225 7/19/2020
1.0.21 58,521 7/6/2020
1.0.20 87,902 6/6/2020
1.0.19 32,577 6/4/2020
1.0.18 59,981 5/29/2020
1.0.17 59,805 5/21/2020
1.0.16 4,103 5/17/2020
1.0.15 60,599 5/12/2020
1.0.14 117,756 5/4/2020
1.0.13 8,200 4/24/2020
1.0.12 10,780 4/22/2020
1.0.11 3,903 4/22/2020
1.0.10 3,922 4/21/2020
1.0.9 34,145 4/18/2020
1.0.8 32,015 4/16/2020
1.0.7 3,784 4/16/2020
1.0.6 27,266 4/15/2020
1.0.5 29,910 4/11/2020
1.0.4 28,720 4/3/2020
1.0.3 3,444 4/1/2020
1.0.2 15,135 3/27/2020
1.0.1 14,117 3/22/2020
1.0.0 6,000 3/22/2020