gpt4 book ai didi

c# - Protobuf-net 使用接口(interface)和抽象基类创建类型模型

转载 作者:行者123 更新时间:2023-11-30 21:08:50 25 4
gpt4 key购买 nike

我正在尝试使用强大的 Protobuf-NET 序列化模型。我不能使用属性(对象在编译时是未知的),所以我构造了一个 TypeModel。我的对象模型由一个类 TestDataObject 组成,这个类有一个属性 ITestDataExtension。抽象基类 TestDataExtensionBase 实现了这个接口(interface)类 TestDataExtension(代码中的 myDataObjectExtA)继承自该基类。

我的 TypeModel 是这样构造的:

        System.IO.MemoryStream tmpMemoryStream = new System.IO.MemoryStream();
RuntimeTypeModel model = TypeModel.Create();
MetaType basetype = model.Add(typeof(TestDataObject), true);
MetaType interfaceType = model.Add(typeof(ITestDataExtension), true);
//MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase));
MetaType extType = interfaceType.AddSubType(200, myDataObjectExtA.GetType());
model.Add(typeof(TestDataExtensionBase), true);
model.Add(myDataObjectA.Ext.GetType(), true);
model.CompileInPlace();
model.Serialize(tmpMemoryStream, myDataObjectA);
byte[] tmpDat = tmpMemoryStream.ToArray();

如果我运行以下基类的属性没有被序列化,我需要它们被序列化。
在我看来,我应该像这样为 TestDataExtensionBase 添加一个子类型:

        MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase));
MetaType extType = extBaseType.AddSubType(200, myDataObjectExtA.GetType());

但这会导致:意外的子类型:TestDataExtension。有谁知道我做错了什么?任何帮助将不胜感激。

最佳答案

2 个问题:

  • 接口(interface)支持目前只提供给成员,而不是根对象(由于多接口(interface)继承的问题);解决此问题的最简单方法是使用带有接口(interface)成员的包装器对象
  • 有必要在模型中定义子类型

认为以下内容符合您的描述...?

using System;
using ProtoBuf.Meta;

interface ITest
{
int X { get; set; }
}
abstract class TestBase : ITest
{
public int X { get; set; } // from interface
public int Y { get; set; }
}
class Test : TestBase
{
public int Z { get; set; }
public override string ToString()
{
return string.Format("{0}, {1}, {2}", X, Y, Z);
}
}
class Wrapper
{
public ITest Value { get; set; }
}
public class Program
{
static void Main()
{
var model = TypeModel.Create();
model.Add(typeof (ITest), false).Add("X")
.AddSubType(10, typeof (TestBase));
model.Add(typeof (TestBase), false).Add("Y")
.AddSubType(10, typeof (Test));
model.Add(typeof (Test), false).Add("Z");
model.Add(typeof (Wrapper), false).Add("Value");

Wrapper obj = new Wrapper {Value = new Test()
{X = 123, Y = 456, Z = 789}};

var clone = (Wrapper)model.DeepClone(obj);
Console.WriteLine(clone.Value);
}
}

关于c# - Protobuf-net 使用接口(interface)和抽象基类创建类型模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9378340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com