强制protobuf-net忽略IEnumerable/ICollection接口

8

我该如何让protobuf-net的v2版本忽略我的类实现了ICollection、IEnumerable等接口的事实呢?

对于这种特定情况,我只想要被标记为[ProtoMember]的字段被序列化。


我目前正在从使用protobuf-net v1转换到使用v2。由于更改,我有一个特定的结构序列化不正确。它看起来像下面这样:

[ProtoContract]
public class FileTree : ICollection<FilePath>, IEnumerable<FilePath>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged {

    private FileTreeNode _Root;

    [ProtoMember (1)]
    public FileTreeNode Root {
        get { return _Root; }
        set { _Root = value; }
    }
}

FileTree 类是为了将文件路径 C:\happy.txt、C:\history.txt 这样的路径合并为更简洁易读的形式而编写的。
"C:\h"
└─── "appy.txt"
└─── "istory.txt"

该结构消除了路径字符串中的冗余。因此,我不希望FileTree类通过IEnumerable函数进行序列化,因为这样它将只被存储为“C:\ happy.txt”,“C:\ history.txt”等。目前,在FileTree对象的序列化中,每个路径都被完整地打印出来。
编辑: 我还应该提到最后一件事——在FileTree中,我有一个标记为[ProtoAfterDeserialization]的On_Deserialization函数。我在函数中设置了断点,但没有命中。这是否与该类的序列化方式有关?

我不知道这是否是v1和v2之间的重大更改。也许微妙的区别在于v1更多地寻找IList<T>,或者是IEnumerable<T>与公共Add的组合。 - Marc Gravell
1个回答

8
[ProtoContract(IgnoreListHandling = true)]
public class FileTree : ICollection<FilePath> ...
{ ... }

应该这样做。我实话实说,我从未考虑过在列表上使用回调函数,因为它们的处理方式与实体非常不同,但是有了上述内容,应该能够工作。如果不行,请告诉我。

从 intellisense 文档中可以看到:

获取或设置一个值,指示此类型不应被视为列表,即使它具有类似于列表的特征(可枚举、添加等)


谢谢!很抱歉在回顾时答案如此明显,而我还打扰了您。我一直在错误的地方寻找答案。 - Amanduh
@Amanduh 当你知道答案时,大多数事情都是显而易见的,然而 - 这是一个好的和有效的问题,幸运的是它现在一个方便的答案(直到最近才有)。 - Marc Gravell
请注意,@MarcGravell,IgnoreListHandling选项在稍微更复杂的情况下可能无法按预期工作。这里这里有一些例子。 - tm1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接