- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经搜索了一段时间,并找到了表明 protobuf-net 可以处理可空类型的各种线程,关于诸如空集合(此处不相关)之类的各种线程,以及以前的默认值行为一直是 proto2 中的“可选”字段,但我还没有找到以下问题的具体答案。这将是我第一次使用 protobuf-net 或 Protocol Buffer 作为序列化格式。
想象一下,我正在使用事件携带状态传输模式在多个不同的应用程序之间发送消息 - 因此消息的发布者和订阅者包含状态 - 以及该状态的某种共享模型。任何参与的应用程序都具有“相同”实体的某种表示(因此是 ECST),但并非所有系统都理解所有属性。就应用程序的 SQL 数据库中的持久性而言,它可能看起来像这样(为简洁起见省略了比例):
table App1Products { productKey int, productName varchar null }
table App2Products { productKey int, productName varchar null, productWeightKg decimal null }
table App3Products { productKey int }
为了示例,假设简单的共享模型是所有不同属性的联合:{ productKey, productName, productWeightKg }
现在假设有人在 App1Products
中更新了一个 productName
。我们想要发布更改后的状态。当我们这样做时,我们无法填充整个共享模型,因为 App1 在其架构中不包含 productWeightKg
。我们需要以某种方式“遗漏”此元素的任何值,让潜在消费者明白它未被填充。
我们不能仅发送默认值 (0)(或让订阅者将缺失的元素反序列化为默认值)来传达“无更新”语义,因为那样会导致 productWeightKg
值当 App2 收到消息时,在 App2Products
表中设置为 0。我们不能发送 null 来传达“无更新”语义,因为 null 也是该列的合法值。
最终,我们需要 App2 的订户代码构造一个更新语句,以便不引用 productWeightKg
列,或者将其简单地设置为自身,我们需要某种方式告诉 App2 的订阅者代码来做到这一点。
一个解决方案似乎是在消息中为每个字段创建一个附加元素,指示该字段是否已设置。在消息内容方面,我们可能会使用这样的东西:
[ProtoContract]
public class Product
{
[ProtoMember(1)]
public int ProductKey { get; set; }
[ProtoMember(2)]
public string productName { get; set; }
[ProtoMember(3)]
public decimal? productWeightKg { get; private set; }
[ProtoMember(4)]
public bool productWeightKgSet { get; private set; }
public void SetProductWeight(decimal? weight)
{
productWeightKg = weight;
productWeightKgSet = true;
}
public void ClearProductWeight()
{
productWeightKgSet = false;
}
}
如果这是一种合理的模式,那么下一个“显而易见”的想法就是为这种行为创建某种模板类,我们可以将其重用于我们所有的消息类......
public class Optional<T>
{
public T Value { get; private set; }
public bool HasValue { get; private set; }
public void Set(T val) { Value = val; HasValue = true; }
public void Clear() { HasValue = false; Value = default; }
}
这是解决此问题的一种合理方法,还是我错过了其他一些“已知的好模式”,或者这种模式不能像预期的那样与 protobuf-net 一起工作?
我目前有限的理解是,这可能需要使用 ProtoInclude 属性使用其所有可能的子实现来装饰 Optional 类,对吗?
最佳答案
最终,protobuf-net 的目的不是提供一个强大的字段跟踪机制,并且由于它针对 POCO 类型工作 - 它没有地方可以存储任何额外的状态,除了你的对象模型提供。它确实支持considitonal序列化,您的模型可以做很多事情来跟踪内部变化,如讨论的here ;这可能与 Merge
结合使用(而不是反序列化)——但超越它并不是开箱即用的东西(大多数其他 POCO 序列化器也没有提供,据我所知)。
您描述的内容与 FieldMask
之间有一些交叉概念,但是:到目前为止,protobuf-net 还没有实现或支持 FieldMask
的需要。
我总是乐于探索图书馆可能能够帮助人们的新事物,但如果缺少图书馆功能:这可能是在 GitHub 上讨论得更好的东西,以及目标的非常具体的细节场景和动机等
关于c# - 用于可选分配的可空类型(不是集合)的 Protobuf-net 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62397017/
我试图了解是否有可能采用构成另一个 protobuf 一部分的序列化 protobuf 并将它们合并在一起而不必反序列化第一个 protobuf。 例如,给定一个 protobuf 包装器: synt
正如我最近发现的,我们可以使用两个类 ProtoBuf.Serializer 和 ProtoBuf.Meta.TypeModel 在 protobuf-net 中序列化/反序列化。例如,假设我们有一个
我正在尝试使用 protobuf 序列化我的下面的类,但它因“对象引用”错误而失败。更多详情如下。通过查看错误详细信息,您知道会出现什么问题吗?注意:我的用户对象太大了,它有太多的子对象和属性。所以不
我想识别要反序列化的文件是否是protobuf序列化的。这是因为我想提供不止一种选项来为用户序列化和反序列化文件。我正在使用 protobuf.net 序列化为 protobuf 格式。 最佳答案 不
我已经使用位于 https://protogen.marcgravell.com/ 的工具构建了我的 C# 类来自 https://developers.google.com/transit/gtfs
有一个通过 UDP 接受消息的 Go 服务器。使用这种设计,它只能扫描一种特定类型的实体,world.Entity . for { buf := make([]byte, 10
比如我想序列化和反序列化System.Drawing.Font这是不可变的,不能更改以适应 protobuf-net 约定。一般来说,是否可以在 protobuf-net 中编写某种“自定义”序列化程
我开始用 protobuf 2.2.0 构建一个应用程序,因为它是最新的。现在我正在考虑升级到最新的 protobuf 2.4.0a。 如果我这样做,对于同一架构,一个版本的应用程序生成的消息是否仍然
在我从 BinaryFormatter 切换到 protobuf-net 的过程中, 我在序列化集合时观察到了差异。 在下面的代码示例中,反序列化(protobuf-net v2r470)返回 如果在
知道正在发送的 protobuf 消息类型的 API 是什么? 例如,我使用以下方法获取 SendNameMessage 对象。 SendNameMessage sendNameObj = Seria
我在我们的一个项目中使用 protobuf-net 来序列化/反序列化一大组同类对象。它运行良好,速度非常快。不过只有一个问题。反序列化时是否可以使用 linq(或任何其他机制)指定过滤条件,以便加载
我正在尝试使用 protobuf-net 序列化一些对象,但不幸的是他们自由地使用了 DateTimeOffset , protobuf-net 尚不支持。这导致了很多: No serializer
我在 ionic2 项目中使用 protobuf.js。我有一个有效的 .proto 文件,我首先将其转换为静态 javascript 文件: pbjs -t static databaseapi.p
我通过 vcpkg vcpkg install protobuf:x64-windows 安装了 protobuf .显然它安装了最新版本(3.6.1)。对于我需要版本<=3.5.1的项目。有没有办法
我有以下类(class):- [Serializable] [DataContract(Name = "StateValueWrapper")] public class StateValueWrap
protobuf net 似乎不支持列表/数组的 AsReference 以及列表/数组内对象的 AsReference。这会在最终的 v2 中得到支持吗? [ProtoMember(1, AsRef
我正在使用 protobuf-net 来序列化和反序列化我的消息。我的消息还包含可以为空的字符串。但是,当我在另一侧反序列化它们时,我得到空字符串 ("")。 根据谷歌文档,空字符串中字符串类型的默认
我已经阅读了有关继承的各种帖子,并且 Protocol Buffer 不支持继承。我不想继承 Protocol Buffers 消息,而是继承,这样我就可以轻松处理我的所有 Protocol Buff
我知道带有 protobuf.net 的列表不支持 AsReference,因此我尝试了解决此限制的方法。我创建了一个名为 SuperList 的自定义列表,其中包含包装在 SuperListItem
我正在尝试使用 ProtoMember 中的 AsReference 选项进行递归引用。如果我使用公共(public)构造函数创建 AnOwner 然后序列化/反序列化,AnOwner.Data 变为
我是一名优秀的程序员,十分优秀!