C#: Saving Data and Objects into Files
1. Introduction
In C#, saving data and objects to files is a common requirement for applications that need to persist information. This document covers various
methods such as text files, JSON, XML, and binary serialization/deserialization.
2. Writing and Reading Text Files
2.1 Writing to a Text File
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "data.txt";
string content = "Hello, this is a text file!";
File.WriteAllText(filePath, content);
}
}
2.2 Reading from a Text File
string readContent = File.ReadAllText("data.txt");
Console.WriteLine(readContent);
2.3 Writing Multiple Lines to a Text File
File.WriteAllLines("data.txt", new string[] {"Line1", "Line2", "Line3"});
2.4 Reading Multiple Lines
string[] lines = File.ReadAllLines("data.txt");
foreach (string line in lines)
{
Console.WriteLine(line);
}
3. JSON Serialization and Deserialization
3.1 Using System.Text.Json
using System;
using System.Text.Json;
using System.IO;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
Person person = new Person { Name = "John", Age = 30 };
string json = JsonSerializer.Serialize(person);
File.WriteAllText("person.json", json);
}
}
3.2 Deserialization from JSON
string jsonData = File.ReadAllText("person.json");
Person person = JsonSerializer.Deserialize<Person>(jsonData);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
4. Binary Serialization and Deserialization
4.1 Writing Binary Data
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
Person person = new Person { Name = "Alice", Age = 25 };
using (FileStream fs = new FileStream("person.dat", FileMode.Create))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, person);
}
}
}
4.2 Reading Binary Data
using (FileStream fs = new FileStream("person.dat", FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
Person person = (Person)formatter.Deserialize(fs);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
5. XML Serialization and Deserialization
5.1 XML Serialization
using System;
using System.IO;
using System.Xml.Serialization;
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
Person person = new Person { Name = "Emma", Age = 22 };
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (TextWriter writer = new StreamWriter("person.xml"))
{
serializer.Serialize(writer, person);
}
}
}
5.2 XML Deserialization
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (TextReader reader = new StreamReader("person.xml"))
{
Person person = (Person)serializer.Deserialize(reader);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
6. Using Streams for File Operations
6.1 Writing with StreamWriter
using (StreamWriter writer = new StreamWriter("stream.txt"))
{
writer.WriteLine("This is a line of text.");
}
6.2 Reading with StreamReader
using (StreamReader reader = new StreamReader("stream.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
7. Serializing Private Fields
In C#, private fields are not serialized by default. To include them in serialization, use [JsonInclude] for JSON or implement custom serialization
logic for binary serialization.
7.1 Serializing Private Fields in JSON
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
class Person
{
[JsonInclude]
private string Secret = "This is a secret";
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
Person person = new Person { Name = "John", Age = 30 };
string json = JsonSerializer.Serialize(person, new JsonSerializerOptions { IncludeFields = true });
Console.WriteLine(json);
}
}
7.2 Serializing Private Fields in Binary Serialization
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class Person : ISerializable
{
private string Secret = "Hidden Info";
public string Name { get; set; }
public int Age { get; set; }
public Person() { }
public Person(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
Age = info.GetInt32("Age");
Secret = info.GetString("Secret");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Age", Age);
info.AddValue("Secret", Secret);
}
}