Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ProtoBuf Net可以反序列化到平面类吗?_C#_Protobuf Net - Fatal编程技术网

C# ProtoBuf Net可以反序列化到平面类吗?

C# ProtoBuf Net可以反序列化到平面类吗?,c#,protobuf-net,C#,Protobuf Net,protobuf net使用嵌套的protobuf构造来支持继承。但是,可以将属性推送到与继承的“序列化”版本具有相同属性的平面目标类中吗 请参见下面的测试示例。不用说,两个属性的平面名称空间的结果都为null 可能的解决方案:首先逐个属性将数据复制到flat.B中。 注意:这不是首选选项 使用系统; 命名空间层次结构 { 使用ProtoBuf; [原始合同] 公共A类 { [原成员(1)] 公共字符串prop1{get;set;} } [原始合同] B级:A级 { 公共图书馆B() { }

protobuf net使用嵌套的protobuf构造来支持继承。但是,可以将属性推送到与继承的“序列化”版本具有相同属性的平面目标类中吗

请参见下面的测试示例。不用说,两个属性的平面名称空间的结果都为null


可能的解决方案:首先逐个属性将数据复制到flat.B中。
注意:这不是首选选项


使用系统;
命名空间层次结构
{
使用ProtoBuf;
[原始合同]
公共A类
{
[原成员(1)]
公共字符串prop1{get;set;}
}
[原始合同]
B级:A级
{
公共图书馆B()
{
}
[原成员(1)]
公共字符串prop2{get;set;}
公共重写字符串ToString()
{
返回“prop1=“+prop1+”,prop2=“+prop2”;
}
}
}
命名空间平面
{
使用ProtoBuf;
[原始合同]
公共B级
{
[原成员(1)]
公共字符串prop1{get;set;}
[原成员(2)]
公共字符串prop2{get;set;}
公共重写字符串ToString()
{
返回“prop1=“+prop1+”,prop2=“+prop2”;
}
}
}
命名空间TestProtoSerialization
{
使用ProtoBuf;
使用System.IO;
公共类Test2
{
公开无效测试()
{
var hb=new hierarchy.B();
hb.prop1=“prop1”;
hb.prop2=“prop2”;
var ms=新内存流();
Serializer.Serialize(ms,hb);
var flatB=序列化程序。反序列化(ms);

Console.WriteLine(hb.ToString());//不是直接的,我也不确定是否有必要这样做。也许我在示例中遗漏了一些东西

为了抓住关键点——甚至忘记继承,您已经破坏了契约——示例中的te字段在一个模型中为1&1,在另一个模型中为1&2

这实际上取决于您的目标是什么;如果您只想将数据推送过来,那么请确保您可以设置一个只知道派生类型的RuntimeTypeModel(禁用自动配置并手动添加字段)。这将只适用于派生类型(显然),但将按照平面模型的预期输出数据:

var model = TypeModel.Create();
model.Add(typeof(B), false)
    .Add("prop1", "prop2");
然后使用model、Serialize等


但是,在c#上编写一个平面转换方法或使用AutoMapper将更为明显。如果我的目标是从输出中删除继承,例如出于互操作性原因,我只会使用上述方法。

这看起来非常熟悉……我在电子邮件中与您讨论过吗?“非常熟悉?”听起来不太好。你需要倒带
内存流
(通过
.Position=0;
),显然是为了让它显式化-这里的TypeModel代码说“忽略属性;这样做”顺便说一句:我在这两方面都尝试了1和2。好的……将致力于统一目标/目的地中的对象(中等大小的作业)。认为这可能只是一个映射/装饰问题。感谢您的快速响应。@sgtz我上面显示的代码应该可以与显示的模型一起工作。我想我缺少的是“为什么?”.但它应该能工作。为什么?工具比什么都重要。这不是一个大问题。从表面上看,它似乎是一个模棱两可的表示。可能不是一个常见的需求。
var model = TypeModel.Create();
model.Add(typeof(B), false)
    .Add("prop1", "prop2");