c# - 具有 Stream 类型成员的对象的 JSON.NET 序列化?

标签 c# .net serialization json.net

希望这是一个我忽略的简单修复。我有一个对象传递到事件处理程序中,我想使用 JSON.NET 序列化该对象,如下所示:

public void OnEvent(IEventObject foo)
{
    // Serialize foo to string/disk here?
    var data = JsonConvert.SerializeObject(foo, Formatting.Indented);
}

foo 的一个或多个成员似乎是流。我已经认识到 Streams 不可序列化,因为它们是对数据而非数据本身的抽象。这是有道理的。

我不知道如何序列化这个对象:

  • a) 将流转换成数据并序列化
  • b) 忽略流并序列化其余成员

一个重要的警告是我无权访问 IEventObject 或其实现,因此我无法使用属性标志标记任何这些对象。

我想出的唯一解决方案是将这个对象包装在我自己的类中,适本地标记它,然后序列化它。稍后我会反序列化回我自己的类,并将其转换为原始对象。我不喜欢这种方法,因为它涉及额外的对象和转换步骤,并且希望尽可能避免它。

最佳答案

默认情况下,Json.NET 将尝试序列化流的属性,这不是很有用。您可以通过创建自己的 contract resolver 来修改行为.下面是一个完全忽略所有 Stream 的示例:

public class IgnoreStreamsResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(
        MemberInfo member,
        MemberSerialization memberSerialization
    )
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        if (typeof(Stream).IsAssignableFrom(property.PropertyType))
        {
            property.Ignored = true;
        }
        return property;
    }
}

像这样使用它:

var bytes = new byte[] { 1, 2, 3 };
var eo = new EventObject { OtherValue = 2, MyStream = new MemoryStream(bytes) };
var s = JsonConvert.SerializeObject(eo,
  new JsonSerializerSettings { ContractResolver = new IgnoreStreamsResolver() });
// {"OtherValue":2}

通过修改 JsonProperty 的其他属性,您可以进行其他更改。看起来对您最有用的是 Converter,它可以让您指定自己的类来定义如何序列化 Stream(例如,将其转换为byte[] 并将其序列化为 base64)。

所有这些都是在不对接口(interface)或实现类进行任何更改的情况下完成的。

关于c# - 具有 Stream 类型成员的对象的 JSON.NET 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23367180/

相关文章:

c# - 通过 TCP 发送大对象 : "End of Stream encountered before parsing was completed"

c# - Crystal Reports ApplyLogOnInfo 从不工作

c# - 如何将字节数组转换为任何类型

.net - ASP.NET 代理应用程序

.net - 处理TFS中客户提出的错误

django - 列表序列化器多个对象创建

c# - 开始在现有代码库中进行自动化集成/单元测试

c# - DataTable 将字段值转换为 T

c# - 如何在 NHibernate 中克隆对象?

serialization - Kotlin 序列化 : "Unresolved reference: serializer"