v10.10.2024.0701 使用IJsonHost改进Json序列化
大石头 编写于 2024-07-01 08:36:34 大石头 提交于 2024-07-01 08:48:33
X
using NewLife.Reflection;

namespace NewLife.Serialization;

/// <summary>完全字符串序列化特性。指示数据流剩下部分全部作为字符串读写</summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class FullStringAttribute : AccessorAttribute
{
    /// <summary>从数据流中读取消息</summary>
    /// <param name="formatter">序列化</param>
    /// <param name="context">上下文</param>
    /// <returns>是否成功</returns>
    public override Boolean Read(IFormatterX formatter, AccessorContext context)
    {
        if (formatter is Binary bn)
        {
            var buf = bn.Stream.ReadBytes(-1);
            var str = bn.Encoding.GetString(buf);
            if (bn.TrimZero && str != null) str = str.Trim('\0');

            context.Value.SetValue(context.Member, str);

            return true;
        }

        return false;
    }

    /// <summary>把消息写入到数据流中</summary>
    /// <param name="formatter">序列化</param>
    /// <param name="context">上下文</param>
    public override Boolean Write(IFormatterX formatter, AccessorContext context)
    {
        if (formatter is Binary bn)
        {
            var str = context.Value.GetValue(context.Member) as String;
            if (!str.IsNullOrEmpty())
            {
                var buf = bn.Encoding.GetBytes(str);
                bn.Write(buf, 0, buf.Length);
            }

            return true;
        }

        return false;
    }

}