Files
RhythmicWallpaper/IpcLibrary/Serialization/JsonMessageSerializer.cs

66 lines
2.0 KiB
C#

using IpcLibrary.Core;
using IpcLibrary.Core.Exceptions;
using IpcLibrary.Serialization;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace IPCLibrary.Serialization {
/// <summary>
/// JSON序列化器实现
/// </summary>
public class JsonMessageSerializer : IMessageSerializer {
private readonly JsonSerializerOptions _options;
public JsonMessageSerializer() {
_options = new JsonSerializerOptions {
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
Converters =
{
new JsonStringEnumConverter(),
new TypeConverter(),
new ExceptionConverter()
}
};
}
public byte[] Serialize(object obj) {
try {
var json = JsonSerializer.Serialize(obj, obj.GetType(), _options);
return System.Text.Encoding.UTF8.GetBytes(json);
} catch (Exception ex) {
throw new IPCException($"序列化失败: {ex.Message}", ex);
}
}
public T Deserialize<T>(byte[] data) {
try {
var json = System.Text.Encoding.UTF8.GetString(data);
return JsonSerializer.Deserialize<T>(json, _options);
} catch (Exception ex) {
throw new IPCException($"反序列化失败: {ex.Message}", ex);
}
}
public object Deserialize(byte[] data, Type type) {
try {
var json = System.Text.Encoding.UTF8.GetString(data);
return JsonSerializer.Deserialize(json, type, _options);
} catch (Exception ex) {
throw new IPCException($"反序列化失败: {ex.Message}", ex);
}
}
}
}