Skip to main content

Basic Serialization

Learn the fundamentals of TOON serialization with practical examples.

Primitive Types​

Strings​

string text = "Hello, ToonNet!";
string toon = ToonSerializer.Serialize(text);
// Output: Hello, ToonNet!

string restored = ToonSerializer.Deserialize<string>(toon);

Numbers​

int number = 42;
string toon = ToonSerializer.Serialize(number);
// Output: 42

double price = 19.99;
string toonPrice = ToonSerializer.Serialize(price);
// Output: 19.99

Booleans​

bool isActive = true;
string toon = ToonSerializer.Serialize(isActive);
// Output: true

bool restored = ToonSerializer.Deserialize<bool>("false");

Null Values​

string? nullValue = null;
string toon = ToonSerializer.Serialize(nullValue);
// Output: null

string? restored = ToonSerializer.Deserialize<string?>("null");

Collections​

Arrays​

int[] numbers = { 1, 2, 3, 4, 5 };
string toon = ToonSerializer.Serialize(numbers);

Output:

- 1
- 2
- 3
- 4
- 5

Lists​

List<string> fruits = new() { "Apple", "Banana", "Cherry" };
string toon = ToonSerializer.Serialize(fruits);

Output:

- Apple
- Banana
- Cherry

Dictionaries​

Dictionary<string, int> scores = new()
{
["Alice"] = 95,
["Bob"] = 87,
["Charlie"] = 92
};

string toon = ToonSerializer.Serialize(scores);

Output:

Alice: 95
Bob: 87
Charlie: 92

Complex Objects​

Simple Object​

public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public bool InStock { get; set; }
}

var product = new Product
{
Name = "Laptop",
Price = 999.99m,
InStock = true
};

string toon = ToonSerializer.Serialize(product);

Output:

Name: Laptop
Price: 999.99
InStock: true

Nested Objects​

public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}

public class Customer
{
public string Name { get; set; }
public Address Address { get; set; }
}

var customer = new Customer
{
Name = "John Doe",
Address = new Address
{
Street = "123 Main St",
City = "New York",
ZipCode = "10001"
}
};

string toon = ToonSerializer.Serialize(customer);

Output:

Name: John Doe
Address:
Street: 123 Main St
City: New York
ZipCode: 10001

Collections of Objects​

public class Employee
{
public string Name { get; set; }
public string Department { get; set; }
public int Salary { get; set; }
}

var employees = new List<Employee>
{
new() { Name = "Alice", Department = "Engineering", Salary = 85000 },
new() { Name = "Bob", Department = "Marketing", Salary = 65000 },
new() { Name = "Charlie", Department = "Sales", Salary = 70000 }
};

string toon = ToonSerializer.Serialize(employees);

Output:

- Name: Alice
Department: Engineering
Salary: 85000
- Name: Bob
Department: Marketing
Salary: 65000
- Name: Charlie
Department: Sales
Salary: 70000

Nullable Types​

Nullable Value Types​

public class NullableExample
{
public int? Age { get; set; }
public DateTime? BirthDate { get; set; }
}

var example1 = new NullableExample { Age = 25, BirthDate = null };
string toon1 = ToonSerializer.Serialize(example1);
// Output:
// Age: 25
// BirthDate: null

var example2 = new NullableExample { Age = null, BirthDate = DateTime.Now };
string toon2 = ToonSerializer.Serialize(example2);
// Output:
// Age: null
// BirthDate: 2026-01-24T17:00:00.0000000Z

Nullable Reference Types​

public class Person
{
public string Name { get; set; } = string.Empty;
public string? MiddleName { get; set; }
public string? Email { get; set; }
}

var person = new Person
{
Name = "John",
MiddleName = null,
Email = "john@example.com"
};

string toon = ToonSerializer.Serialize(person);

Output:

Name: John
MiddleName: null
Email: john@example.com

Enums​

Simple Enum​

public enum Status
{
Pending,
Active,
Completed,
Cancelled
}

public class Task
{
public string Title { get; set; }
public Status Status { get; set; }
}

var task = new Task { Title = "Review PR", Status = Status.Active };
string toon = ToonSerializer.Serialize(task);

Output:

Title: Review PR
Status: Active

Enum Flags​

[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Execute = 4,
Delete = 8
}

var permissions = Permissions.Read | Permissions.Write;
string toon = ToonSerializer.Serialize(permissions);
// Output: Read, Write

DateTime and DateTimeOffset​

public class Event
{
public string Name { get; set; }
public DateTime EventDate { get; set; }
public DateTimeOffset RegisteredAt { get; set; }
}

var evt = new Event
{
Name = "Conference 2026",
EventDate = new DateTime(2026, 06, 15, 9, 0, 0),
RegisteredAt = DateTimeOffset.Now
};

string toon = ToonSerializer.Serialize(evt);

Output:

Name: Conference 2026
EventDate: 2026-06-15T09:00:00.0000000
RegisteredAt: 2026-01-24T17:00:00.0000000+00:00

Common Patterns​

Optional Properties​

public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string? Bio { get; set; } // Optional
public string? Website { get; set; } // Optional
}

var user = new User
{
Id = 123,
Username = "alice",
Bio = "Software Engineer"
// Website is null
};

string toon = ToonSerializer.Serialize(user);

Output:

Id: 123
Username: alice
Bio: Software Engineer
Website: null

Nested Collections​

public class Department
{
public string Name { get; set; }
public List<string> Teams { get; set; }
}

var dept = new Department
{
Name = "Engineering",
Teams = new List<string> { "Backend", "Frontend", "DevOps" }
};

string toon = ToonSerializer.Serialize(dept);

Output:

Name: Engineering
Teams:
- Backend
- Frontend
- DevOps

Deserialization Examples​

From String​

string toonInput = """
Name: Alice
Age: 30
Email: alice@example.com
""";

var person = ToonSerializer.Deserialize<Person>(toonInput);

From File​

// Async file deserialization
var config = await ToonSerializer.DeserializeAsync<AppConfig>(
File.OpenRead("appsettings.toon")
);

From Stream​

using var stream = new MemoryStream(Encoding.UTF8.GetBytes(toonString));
var data = ToonSerializer.Deserialize<MyData>(stream);

Error Handling​

try
{
var person = ToonSerializer.Deserialize<Person>(invalidToonString);
}
catch (ToonParseException ex)
{
Console.WriteLine($"Parse error at line {ex.Line}, column {ex.Column}");
Console.WriteLine($"Expected: {ex.ExpectedToken}, Got: {ex.ActualToken}");
}
catch (ToonSerializationException ex)
{
Console.WriteLine($"Serialization error: {ex.Message}");
Console.WriteLine($"Property: {ex.PropertyName}, Type: {ex.TargetType}");
}

Best Practices​

  1. Use nullable types for optional properties
  2. Initialize collections to avoid null checks
  3. Use record types for immutable data
  4. Handle exceptions appropriately in production
  5. Use async methods for I/O operations

Next Steps​