Ecng.Serialization 1.0.307

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Serialization --version 1.0.307
                    
NuGet\Install-Package Ecng.Serialization -Version 1.0.307
                    
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.307" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Serialization" Version="1.0.307" />
                    
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.307
                    
#r "nuget: Ecng.Serialization, 1.0.307"
                    
#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.307
                    
#: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.307
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Serialization&version=1.0.307
                    
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.309 0 12/25/2025
1.0.308 551 12/22/2025
1.0.307 494 12/21/2025
1.0.306 606 12/19/2025
1.0.305 598 12/19/2025
1.0.304 837 12/17/2025
1.0.303 875 12/15/2025
1.0.302 632 12/15/2025
1.0.301 610 12/14/2025
1.0.300 1,687 12/12/2025
1.0.299 877 12/12/2025
1.0.298 482 12/12/2025
1.0.297 494 12/12/2025
1.0.296 861 12/12/2025
1.0.295 1,188 12/2/2025
1.0.294 1,065 12/2/2025
1.0.293 1,067 12/2/2025
1.0.292 679 11/30/2025
1.0.291 534 11/29/2025
1.0.290 535 11/28/2025
1.0.289 519 11/28/2025
1.0.288 608 11/27/2025
1.0.287 691 11/24/2025
1.0.286 589 11/24/2025
1.0.285 612 11/23/2025
1.0.284 587 11/23/2025
1.0.283 646 11/22/2025
1.0.282 1,542 11/20/2025
1.0.281 866 11/18/2025
1.0.280 801 11/18/2025
1.0.279 827 11/13/2025
1.0.278 715 11/10/2025
1.0.277 1,607 11/1/2025
1.0.276 837 10/28/2025
1.0.275 797 10/27/2025
1.0.274 665 10/27/2025
1.0.273 584 10/25/2025
1.0.272 2,319 10/11/2025
1.0.271 2,021 10/3/2025
1.0.270 2,041 9/28/2025
1.0.269 733 9/25/2025
1.0.268 5,196 9/2/2025
1.0.267 3,147 8/30/2025
1.0.266 784 8/30/2025
1.0.265 1,646 8/19/2025
1.0.264 660 8/15/2025
1.0.263 5,503 7/16/2025
1.0.262 1,962 7/13/2025
1.0.261 604 7/13/2025
1.0.260 609 7/12/2025
1.0.259 1,839 7/8/2025
1.0.258 1,374 7/4/2025
1.0.257 663 7/2/2025
1.0.256 5,420 6/16/2025
1.0.255 800 6/9/2025
1.0.254 693 6/8/2025
1.0.253 2,295 5/21/2025
1.0.252 819 5/17/2025
1.0.251 2,351 5/12/2025
1.0.250 712 5/12/2025
1.0.249 637 5/11/2025
1.0.248 619 5/11/2025
1.0.247 571 5/10/2025
1.0.246 579 5/10/2025
1.0.245 1,318 4/17/2025
1.0.244 710 4/15/2025
1.0.243 647 4/12/2025
1.0.242 4,794 3/22/2025
1.0.241 670 3/20/2025
1.0.240 634 3/20/2025
1.0.239 659 3/19/2025
1.0.238 5,551 2/26/2025
1.0.237 710 2/26/2025
1.0.236 9,153 2/5/2025
1.0.235 4,485 1/21/2025
1.0.234 686 1/20/2025
1.0.233 556 1/20/2025
1.0.232 677 1/19/2025
1.0.231 2,276 1/14/2025
1.0.230 1,042 1/12/2025
1.0.229 630 1/12/2025
1.0.228 640 1/12/2025
1.0.227 781 1/12/2025
1.0.226 1,278 1/10/2025
1.0.225 4,759 12/27/2024
1.0.224 654 12/19/2024
1.0.223 1,125 11/20/2024
1.0.222 4,077 11/18/2024
1.0.221 2,496 11/7/2024
1.0.220 1,050 10/31/2024
1.0.219 949 10/19/2024
1.0.218 3,757 10/12/2024
1.0.217 1,336 10/9/2024
1.0.216 3,764 10/5/2024
1.0.215 5,390 9/18/2024
1.0.214 686 9/17/2024
1.0.213 4,996 9/3/2024
1.0.212 693 9/1/2024
1.0.211 4,491 8/8/2024
1.0.210 11,147 6/12/2024
1.0.209 3,464 5/28/2024
1.0.208 4,289 5/4/2024
1.0.207 2,928 4/23/2024
1.0.206 2,016 4/21/2024
1.0.205 866 4/14/2024
1.0.204 6,225 3/28/2024
1.0.203 806 3/17/2024
1.0.202 4,103 2/23/2024
1.0.201 716 2/23/2024
1.0.200 4,041 2/18/2024
1.0.199 703 2/18/2024
1.0.198 779 2/16/2024
1.0.197 2,812 2/13/2024
1.0.196 2,613 2/8/2024
1.0.195 2,981 2/5/2024
1.0.194 711 2/4/2024
1.0.193 3,118 1/23/2024
1.0.192 697 1/23/2024
1.0.191 2,466 1/12/2024
1.0.190 5,751 1/2/2024
1.0.189 856 12/29/2023
1.0.188 5,507 12/15/2023
1.0.187 1,159 12/15/2023
1.0.186 1,217 12/13/2023
1.0.185 779 12/13/2023
1.0.184 12,336 11/12/2023
1.0.183 1,310 11/10/2023
1.0.182 858 11/10/2023
1.0.181 1,109 11/9/2023
1.0.180 1,916 11/3/2023
1.0.179 843 11/1/2023
1.0.178 897 11/1/2023
1.0.177 26,073 9/8/2023
1.0.176 1,259 9/8/2023
1.0.175 1,424 9/3/2023
1.0.174 1,700 8/21/2023
1.0.173 1,331 8/15/2023
1.0.172 894 8/14/2023
1.0.171 882 8/14/2023
1.0.170 1,486 8/10/2023
1.0.169 40,879 7/1/2023
1.0.168 1,051 6/29/2023
1.0.167 16,416 5/27/2023
1.0.166 1,364 5/21/2023
1.0.165 1,513 5/19/2023
1.0.164 26,792 5/8/2023
1.0.163 3,649 5/1/2023
1.0.162 2,774 4/22/2023
1.0.161 1,334 4/21/2023
1.0.160 51,945 4/3/2023
1.0.159 3,190 3/27/2023
1.0.158 2,747 3/21/2023
1.0.157 3,541 3/13/2023
1.0.156 20,110 3/6/2023
1.0.155 2,426 2/26/2023
1.0.154 17,265 2/21/2023
1.0.153 1,549 2/20/2023
1.0.152 2,940 2/15/2023
1.0.151 1,545 2/14/2023
1.0.150 33,957 2/9/2023
1.0.149 18,085 2/7/2023
1.0.148 2,186 2/4/2023
1.0.147 22,289 2/2/2023
1.0.146 18,468 1/30/2023
1.0.145 7,415 1/18/2023
1.0.144 45,904 12/30/2022
1.0.143 3,372 12/23/2022
1.0.142 22,901 12/12/2022
1.0.141 25,497 12/4/2022
1.0.140 2,415 12/4/2022
1.0.139 3,153 11/30/2022
1.0.138 2,414 11/29/2022
1.0.137 2,446 11/28/2022
1.0.136 6,697 11/18/2022
1.0.135 29,643 11/11/2022
1.0.134 2,406 11/11/2022
1.0.133 2,407 11/10/2022
1.0.132 2,649 11/5/2022
1.0.131 3,977 11/4/2022
1.0.130 26,540 11/1/2022
1.0.129 26,996 10/16/2022
1.0.128 9,646 9/10/2022
1.0.127 53,608 9/8/2022
1.0.126 2,835 9/8/2022
1.0.125 2,788 9/8/2022
1.0.124 2,781 9/4/2022
1.0.123 2,837 9/4/2022
1.0.122 93,129 8/24/2022
1.0.121 9,755 8/8/2022
1.0.120 3,022 8/8/2022
1.0.119 6,201 7/26/2022
1.0.118 3,266 7/26/2022
1.0.117 56,350 7/19/2022
1.0.116 48,620 7/18/2022
1.0.115 8,423 7/8/2022
1.0.114 7,537 6/18/2022
1.0.113 3,268 6/6/2022
1.0.112 100,503 4/30/2022
1.0.111 3,594 4/20/2022
1.0.110 3,570 4/10/2022
1.0.109 3,454 4/7/2022
1.0.108 3,455 4/7/2022
1.0.107 3,574 4/2/2022
1.0.106 15,132 3/29/2022
1.0.105 3,455 3/27/2022
1.0.104 3,478 3/27/2022
1.0.103 292,692 1/24/2022
1.0.102 165,198 12/29/2021
1.0.101 31,366 12/20/2021
1.0.100 3,991 12/13/2021
1.0.99 31,785 12/7/2021
1.0.98 30,550 12/6/2021
1.0.97 2,178 12/6/2021
1.0.96 3,966 12/2/2021
1.0.95 32,096 11/29/2021
1.0.94 30,907 11/22/2021
1.0.93 2,274 11/17/2021
1.0.92 2,212 11/14/2021
1.0.91 31,045 11/13/2021
1.0.90 2,287 11/11/2021
1.0.89 2,243 11/11/2021
1.0.88 2,299 11/10/2021
1.0.87 2,396 11/9/2021
1.0.86 65,350 11/5/2021
1.0.85 2,398 11/5/2021
1.0.84 2,362 11/4/2021
1.0.83 2,251 11/4/2021
1.0.82 2,256 11/3/2021
1.0.81 2,420 10/30/2021
1.0.80 33,927 10/21/2021
1.0.79 2,889 10/17/2021
1.0.78 64,311 10/14/2021
1.0.77 13,780 10/13/2021
1.0.76 2,419 10/12/2021
1.0.75 34,421 10/11/2021
1.0.74 2,258 10/9/2021
1.0.73 37,691 10/7/2021
1.0.72 39,739 10/7/2021
1.0.71 2,346 10/7/2021
1.0.70 2,356 10/6/2021
1.0.69 2,376 9/28/2021
1.0.68 36,700 9/23/2021
1.0.67 2,557 9/11/2021
1.0.66 2,061 9/10/2021
1.0.65 2,074 9/9/2021
1.0.64 2,019 9/8/2021
1.0.63 2,021 9/8/2021
1.0.62 33,432 9/6/2021
1.0.61 2,236 8/31/2021
1.0.60 2,214 8/30/2021
1.0.59 36,256 7/31/2021
1.0.58 62,861 7/30/2021
1.0.57 2,706 7/26/2021
1.0.56 92,967 7/5/2021
1.0.55 2,603 7/1/2021
1.0.54 65,978 6/4/2021
1.0.53 94,515 4/26/2021
1.0.52 33,854 4/19/2021
1.0.51 154,174 4/7/2021
1.0.50 33,200 4/3/2021
1.0.49 183,320 3/22/2021
1.0.48 116,231 3/4/2021
1.0.47 36,175 2/26/2021
1.0.46 171,858 2/2/2021
1.0.45 60,305 1/26/2021
1.0.44 59,627 1/24/2021
1.0.43 2,864 1/24/2021
1.0.42 3,022 1/23/2021
1.0.41 61,012 1/20/2021
1.0.40 3,004 1/20/2021
1.0.39 31,724 1/18/2021
1.0.38 2,929 1/18/2021
1.0.37 30,749 1/16/2021
1.0.36 121,914 12/16/2020
1.0.35 58,584 12/14/2020
1.0.34 36,160 12/9/2020
1.0.33 5,300 12/6/2020
1.0.32 3,487 12/2/2020
1.0.31 3,369 12/2/2020
1.0.30 31,787 12/1/2020
1.0.29 189,219 11/12/2020
1.0.29-atestpub 1,598 11/11/2020
1.0.28 32,937 10/11/2020
1.0.27 114,852 9/9/2020
1.0.26 31,355 9/3/2020
1.0.25 31,920 8/20/2020
1.0.24 87,548 8/9/2020
1.0.23 32,158 7/28/2020
1.0.22 31,202 7/19/2020
1.0.21 58,498 7/6/2020
1.0.20 87,852 6/6/2020
1.0.19 32,544 6/4/2020
1.0.18 59,938 5/29/2020
1.0.17 59,779 5/21/2020
1.0.16 4,074 5/17/2020
1.0.15 60,564 5/12/2020
1.0.14 117,723 5/4/2020
1.0.13 8,178 4/24/2020
1.0.12 10,759 4/22/2020
1.0.11 3,878 4/22/2020
1.0.10 3,897 4/21/2020
1.0.9 34,121 4/18/2020
1.0.8 31,993 4/16/2020
1.0.7 3,761 4/16/2020
1.0.6 27,240 4/15/2020
1.0.5 29,888 4/11/2020
1.0.4 28,697 4/3/2020
1.0.3 3,423 4/1/2020
1.0.2 15,113 3/27/2020
1.0.1 14,090 3/22/2020
1.0.0 5,966 3/22/2020

Added comprehensive README.md documentation for all projects