Ecng.Serialization
1.0.307
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
<PackageReference Include="Ecng.Serialization" Version="1.0.307" />
<PackageVersion Include="Ecng.Serialization" Version="1.0.307" />
<PackageReference Include="Ecng.Serialization" />
paket add Ecng.Serialization --version 1.0.307
#r "nuget: Ecng.Serialization, 1.0.307"
#:package Ecng.Serialization@1.0.307
#addin nuget:?package=Ecng.Serialization&version=1.0.307
#tool nuget:?package=Ecng.Serialization&version=1.0.307
Ecng.Serialization
A comprehensive serialization library providing JSON serialization and high-performance binary primitives for .NET applications.
Table of Contents
- Overview
- Installation
- Quick Start
- Core Concepts
- JSON Serialization
- Binary Serialization
- SettingsStorage
- IPersistable Interface
- Extension Methods
- Advanced Features
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
SpanWriterandSpanReaderfor 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
IPersistableorIAsyncPersistable - 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
SpanWriterandSpanReaderuse 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
SettingsStorageis thread-safeJsonSerializer<T>instances are thread-safe for concurrent readsSpanWriterandSpanReaderare 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 | Versions 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. |
-
.NETStandard 2.0
- Ecng.Reflection (>= 1.0.275)
- Ecng.Security (>= 1.0.268)
-
net10.0
- Ecng.Reflection (>= 1.0.275)
- Ecng.Security (>= 1.0.268)
-
net6.0
- Ecng.Reflection (>= 1.0.275)
- Ecng.Security (>= 1.0.268)
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