我有机会花费大量时间尝试在单声道中使用WCF.对于玩具应用之外的任何东西,此时实施起来实施得太差,无法投入生产环境.它不能在24/7负载下存活.
我目前在生产环境中运行Mono上的WCF,但我需要远离它,至少在近期内,为我的软件带来稳定性.目前,我通过每隔几个小时重新启动进程而幸存下来,而这往往是不够的.
我正在寻找潜在的替代品.我的所有通信实体都是基于.net的,其中一些是Linux上的Mono,另一些是Windows Server上的ms.net.我很想用protobuf-net作为序列化层来推广我自己的RPC 层,但我不想这样做.protobuf-net的一大优点是它具有良好的C++支持,这是我重视的东西.
有没有人在Mono上实现RPC的稳定性?如果是这样,你做了什么?
更新:我没有提到我正在寻找有状态的双工消息.这是一个非常重要的信息.我并没有坚持下去,但我非常想要它.WCF为此提供net-tcp双工通道.
是否可以检测原始协议缓冲区消息的类型(在byte []中)
我有一种情况,端点可以接收不同的消息,我需要能够检测类型,然后才能反序列化它.
我正在使用protobuf-net
我一直在阅读有关protobuf-net的内容,这太棒了!
有没有我可以使用的教程?(更具体地说是Dictionary<TKey,TValue>对于仿制药的合同)
有没有与之相关的提示?
我可以简单地将其插入我当前的代码库中,还是需要进行任何更改?
使用protobuf-net序列化枚举需要做些什么?我在序列化具有枚举属性的类时遇到以下错误,如果从属性声明中删除了DataMember属性,则它可以正常工作.
"System.InvalidOperationException:只能处理数据协定类(以及此类的列表/数组)"
是否有可能在protobuf-net中生成可空的成员?
message ProtoBuf1 {
optional Int32? databit = 1;
optional Nullable<bool> databool = 2;
}
Run Code Online (Sandbox Code Playgroud) 我在某处读过ProtoBuf.NET的作者的评论:
有自动推断数字的选项,但这很脆弱,不推荐.只有当你知道你永远不需要添加更多成员时才使用它(它按字母顺序排序,因此添加新的AardvarkCount会破坏所有内容).
这正是我感兴趣的那种情况:)
我有一些类似于map-reduce场景的东西,我希望使用协议缓冲区(例如map-reduce的"map"侧)序列化在远程机器上生成的结果,然后读取它们并将这些结果组合起来进行进一步处理(例如"减少"方面).
我不想在我可能在此过程中序列化的每个可能的类上启动属性修饰马拉松,并且我发现协议缓冲区非常诱人,因为我可以使用Mono创建结果并在MS上毫不费力地使用它们. NET反之亦然......
没有预先标记成员的明显缺点并没有打扰我,因为完全相同的软件修订版生成/消费,所以我不需要担心新成员弹出代码并弄乱我的整个方案......
简而言之,我的问题是:
我有一个DataContracts的程序集,我需要为它生成.proto模式,以便能够与java系统交换数据.DataContracts代码可以更改,但我无法在其中添加[ProtoContract]和[ProtoMember]属性,因为它将导致protobuf-net程序集依赖性.我们在系统的C#部分中使用WCF,因此我们不希望在大多数不适用于Java系统的C#项目中依赖proto-buf程序集.
在GettingStarted部分的protobuf-net网站上,它说:
不喜欢属性?
在v2中,可以通过RuntimeTypeModel在运行时配置可以使用属性完成的所有操作.
但是我不知道如何在没有属性的情况下实际配置序列化,我还没有看到任何这样的例子.
我正在努力做到
[DataContract]
public class MyEntity
{
[DataMember(Order = 1)]
public String PropertyA { get; set; }
[DataMember(Order = 2)]
public int PropertyB { get; set; }
}
RuntimeTypeModel.Default.Add(typeof(MyEntity), false);
string proto = Serializer.GetProto<MyEntity>();
Run Code Online (Sandbox Code Playgroud)
并获得以下值作为 proto
package ProtobufTest;
message MyEntity {
}
Run Code Online (Sandbox Code Playgroud) 我有一个依赖于 proto B 的 proto A。然后我弃用了 protoB 字段:
import "protoB.proto";
message ProtoA {
string assignmentStatus = 1;
protoB proto_b = 2 [deprecated = true];
}
Run Code Online (Sandbox Code Playgroud)
我想在这种情况下我应该能够删除该import声明,对吗?但是当我这样做时,编译器抱怨依赖项没有被导入。
这是怎么回事?
在"完整".NET中,交换序列化程序非常容易 - 无论是在配置中还是通过自定义属性.但是,我想在Silverlight的WCF中做类似的事情 - 即提供不同的序列化引擎.我将提供引擎(protobuf-net) - 我只需要让WCF使用它!
上次我看到这个(前一段时间)没有明显的好选择.我最好的kludge是将数据公开为byte[]或Stream- 但这会失去所有"mex"善良.这是一种耻辱,因为它完全适用于完整的.NET.
这可能吗?WP7的加分点:)
这个方法接受一个整数作为最后一个参数,但我不确定我是否理解我将完全使用它.
Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]);
Run Code Online (Sandbox Code Playgroud)
对于相应的Deserialize方法也是如此.
它只是一种标记消息的方法,可以在反序列化时添加某种"查询"功能,以过滤掉不需要的消息,还是有任何其他用法?