c#序列化日常操作

       使用C#中的`System.Text.Json`库来序列化和反序列化一个包含字符串的`List<string>`到文件,并通过`FileStream`进行读写操作,可以按照以下步骤实现:

首先,确保已引用了 `System.Text.Json` 命名空间。

using System;

using System.Collections.Generic;

using System.IO;

using System.Text.Json;

public class Program

{

    public static void Main()

    {

        // 创建一个 List<string>

        List<string> list1 = new List<string> { "我", "爱", "学习", "中文", "和地方文化" };

        // 序列化 List 到 JSON 字符串

        string json = JsonSerializer.Serialize(list1);

        // 使用 FileStream 写入到文件

        using (FileStream fs = new FileStream("list.json", FileMode.Create, FileAccess.Write))

        {

            byte[] utf8Json = Encoding.UTF8.GetBytes(json);

            fs.Write(utf8Json, 0, utf8Json.Length);

        }

        // 从文件反序列化 JSON 到 List<string>

        List<string> deserializedList = new List<string>();

        using (FileStream fs = new FileStream("list.json", FileMode.Open, FileAccess.Read))

        {

            // 读取文件内容为内存流

            var streamReader = new StreamReader(fs, Encoding.UTF8);

            string fileContent = streamReader.ReadToEnd();

            // 反序列化 JSON 字符串

            deserializedList = JsonSerializer.Deserialize<List<string>>(fileContent);

        }

        // 输出反序列化后的 List 以验证数据是否正确恢复

        foreach (var item in deserializedList)

        {

            Console.WriteLine(item);

        }

    }

       这段代码首先将列表序列化为JSON格式的字符串,然后将其写入名为“list.json”的文件中。之后打开该文件,读取其内容并反序列化回`List<string>`对象。最后输出反序列化后的列表内容,以确认数据保存与读取的正确性。

        使用 `System.Text.Json` 库对 `List<Person>` 进行序列化和反序列化,并通过 `Stream` 或 `FileStream` 来读写文件。

        使用 `System.Text.Json` 将 `List<Person>` 序列化到一个文件流中,然后从该文件流反序列化回 `List<Person>`:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public static void SerializeToFile(List<Person> people)
{
    // 创建 JSON 序列化器选项(如果有需要,可以设置自定义选项)
    var options = new JsonSerializerOptions
    {
        WriteIndented = true, // 可选:格式化输出以便于阅读
    };

    // 使用 FileStream 创建或覆盖目标文件
    using (FileStream stream = new FileStream("people.json", FileMode.Create))
    {
        // 序列化 List<Person> 到 JSON 并写入文件流
        JsonSerializer.Serialize(stream, people, options);
    }
}

public static List<Person> DeserializeFromFile()
{
    List<Person> peopleList = new List<Person>();

    // 使用 FileStream 打开已存在的 JSON 文件
    using (FileStream stream = new FileStream("people.json", FileMode.Open))
    {
        // 从文件流反序列化 JSON 数据到 List<Person>
        peopleList = JsonSerializer.Deserialize<List<Person>>(stream);
    }

    return peopleList;
}

// 示例用法
public static void Main(string[] args)
{
    List<Person> people = new List<Person>
    {
        new Person { FirstName = "John", LastName = "Doe" },
        new Person { FirstName = "Jane", LastName = "Smith" },
    };

    SerializeToFile(people);

    List<Person> deserializedPeople = DeserializeFromFile();

    foreach (var person in deserializedPeople)
    {
        Console.WriteLine($"{person.FirstName} {person.LastName}");
    }
}

      这段代码首先定义了一个 `Person` 类,然后提供了两个静态方法:一个用于将 `List<Person>` 序列化到文件,另一个用于从文件反序列化 `List<Person>`。在实际操作时,确保具有相应的文件访问权限,并且正确处理可能出现的任何异常。

       将数据序列化后进行压缩保存可以减少存储空间,这对于网络传输或本地存储资源有限的情况特别有用。以下是一种使用GZipStream进行压缩和解压缩的简单方法,配合JSON.NET(Newtonsoft.Json)进行序列化的示例:
using System;
using System.IO;
using System.IO.Compression;
using Newtonsoft.Json;

// 假设我们有一个需要序列化并压缩保存的对象
public class MyClass
{
    public string Property1 { get; set; }
    public int Property2 { get; set; }
}

public static class SerializationHelper
{
    // 序列化并压缩对象到一个流
    public static void SerializeAndCompressToStream(MyClass data, Stream outputStream)
    {
        using (var gzip = new GZipStream(outputStream, CompressionLevel.Optimal))
        {
            var json = JsonConvert.SerializeObject(data);
            var bytes = System.Text.Encoding.UTF8.GetBytes(json);

            gzip.Write(bytes, 0, bytes.Length);
        }
    }

    // 从压缩的流中反序列化对象
    public static MyClass DeserializeAndDecompressFromStream(Stream inputStream)
    {
        using (var gzip = new GZipStream(inputStream, CompressionMode.Decompress))
        {
            using (var streamReader = new StreamReader(gzip, System.Text.Encoding.UTF8))
            {
                var jsonString = streamReader.ReadToEnd();
                return JsonConvert.DeserializeObject<MyClass>(jsonString);
            }
        }
    }

    // 示例:将对象序列化并压缩到文件
    public static void SerializeAndCompressToFile(MyClass data, string filePath)
    {
        using (FileStream fileStream = File.Create(filePath))
        {
            SerializeAndCompressToStream(data, fileStream);
        }
    }

    // 示例:从压缩文件中反序列化对象
    public static MyClass DeserializeAndDecompressFromFile(string filePath)
    {
        using (FileStream fileStream = File.OpenRead(filePath))
        {
            return DeserializeAndDecompressFromStream(fileStream);
        }
    }
}

       在这个例子中,`SerializeAndCompressToFile` 方法会将给定的对象序列化为JSON字符串,然后将其压缩并写入指定的文件路径。而 `DeserializeAndDecompressFromFile` 方法则读取压缩文件,解压缩其中的数据,并将其反序列化回原始对象类型。

       注意,这里使用了Json.NET库来处理JSON序列化和反序列化,同时也利用了 .NET Framework 提供的 `System.IO.Compression.GZipStream` 来进行数据压缩与解压操作。

         在C#中,使用`System.Text.Json`进行反序列化时,如果要反序列化的JSON没有对应的目标类,可以利用匿名类型或者动态对象(`System.Text.Json.JsonDocument`或`System.Dynamic.ExpandoObject`)来实现。这里是一个例子,说明如何将JSON反序列化为动态对象:
using System;
using System.Text.Json;

public class Program
{
    public static void Main()
    {
        // JSON字符串
        string json = "{\"Name\":\"John\", \"Age\":30, \"City\":\"New York\"}";

        // 使用JsonSerializer.Deserialize方法和ExpandoObject实现动态反序列化
        var options = new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true,
        };

        dynamic obj = JsonSerializer.Deserialize<ExpandoObject>(json, options);

        // 现在可以通过动态属性访问JSON数据
        Console.WriteLine($"Name: {obj.Name}");
        Console.WriteLine($"Age: {obj.Age}");
        Console.WriteLine($"City: {obj.City}");
    }
}
       请注意,`ExpandoObject`允许您以动态方式访问JSON对象的属性,但请确保您使用的.NET版本支持这种用法。

       另一种方法是使用`JsonElement`和`JsonDocument`来解析JSON,并以非面向对象的方式遍历和读取JSON结构:
using System;
using System.Text.Json;

public class Program
{
    public static void Main()
    {
        string json = "{\"Name\":\"John\", \"Age\":30, \"City\":\"New York\"}";

        // 使用JsonDocument解析整个JSON文档
        JsonDocument document = JsonDocument.Parse(json);

        // 获取根元素
        JsonElement rootElement = document.RootElement;

        // 动态读取属性
        Console.WriteLine($"Name: {rootElement.GetProperty("Name").GetString()}");
        Console.WriteLine($"Age: {rootElement.GetProperty("Age").GetInt32()}");
        Console.WriteLine($"City: {rootElement.GetProperty("City").GetString()}");

        // 不再需要document时,释放资源
        document.Dispose();
    }
}

        这种方法不依赖于任何预定义的类结构,但提供了更底层、更直接的方式来处理JSON内容。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值