using System;
using System.ComponentModel;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Hncore.Infrastructure.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Hncore.Infrastructure.Serializer
{
public static class ObjectExtension
{
#region 序列化为二进制
///
/// 序列化位二进制
///
/// 要序列化的对象
/// 字节数组
public static byte[] SerializeBinary(this object request)
{
using (MemoryStream memStream = new MemoryStream())
{
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(memStream, request);
return memStream.GetBuffer();
}
}
#endregion
#region 二进制反序列化
///
/// 二进制反序列化
///
/// 字节数组
/// 得到的对象
public static T DeserializeBinary(this byte[] buf) where T : class, new()
{
if (buf == null)
{
return default(T);
}
using (MemoryStream memStream = new MemoryStream(buf))
{
memStream.Position = 0;
BinaryFormatter deserializer = new BinaryFormatter();
T info = (T) deserializer.Deserialize(memStream);
memStream.Close();
return info;
}
}
#endregion
#region Json序列化
///
/// Json序列化
///
public static string ToJson(this object item, bool format = false)
{
using (StringWriter sw = new StringWriter())
{
JsonSerializer serializer = JsonSerializer.Create(
new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
//NullValueHandling = NullValueHandling.Ignore,
DateFormatString = "yyyy-MM-dd HH:mm:ss"
}
);
JsonWriter jsonWriter;
if (format)
{
jsonWriter = new JsonTextWriter(sw)
{
Formatting = Formatting.Indented,
Indentation = 4,
IndentChar = ' '
};
}
else
{
jsonWriter = new JsonTextWriter(sw);
}
using (jsonWriter)
{
serializer.Serialize(jsonWriter, item);
}
return sw.ToString();
}
}
#endregion
#region Json反序列化
///
/// Json反序列化
///
public static T FromJsonTo(this string jsonString)
{
try
{
if (!string.IsNullOrWhiteSpace(jsonString))
{
T t = JsonConvert.DeserializeObject(jsonString);
return t;
}
else
{
return default(T);
}
}
catch (Exception ex)
{
LogHelper.Error($"Json反序列化出错", $"待反序列化的json字符串为{jsonString},错误信息:{ex}");
return default(T);
}
}
public static T FromJsonToOrDefault(this string str)
{
try
{
if (string.IsNullOrEmpty(str) || str == "[]" || str == "{}")
{
return default(T);
}
else
{
return JsonConvert.DeserializeObject(str);
}
}
catch (Exception ex)
{
LogHelper.Error($"Json反序列化出错", $"待反序列化的json字符串为{str},错误信息:{ex}");
return default(T);
}
}
#endregion
#region 获取json字符串中的属性值
///
/// 获取json字符串中的属性值
///
/// json字符串
/// "result:data:name"
///
public static string JsonItemValue(this string str, string key)
{
var defaultValue = "";
if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(key)) return defaultValue;
var JObject = JsonConvert.DeserializeObject(str) as JToken;
var res = GetJsonItem(JObject, key.Split(':'), 0) ?? defaultValue;
return res.ToString();
}
private static JToken GetJsonItem(JToken JToken, string[] arr, int index)
{
if (JToken == null || index == arr.Length)
{
return JToken;
}
else
{
JToken = JToken[arr[index]];
index++;
}
return GetJsonItem(JToken, arr, index);
}
#endregion
}
}