如何向 protobuf-net 指示接口属性应反序列化为特定的具体类型?

发布于 2024-11-09 11:16:48 字数 474 浏览 0 评论 0原文

我有这个属性:

public class SomeClass
{
  public ISomeInterface SomeProperty { get;set; }
}

现在,这个特定上下文中的 ISomeInterface 只能是特定的具体类型,例如 SomeClass2。我可以在没有 ProtoIninclude 属性的情况下做到这一点吗?

我想我可以做这样的事情:

model.Add(typeof(SomeClass), true).Add(1, "SomeProperty", typeof(SomeClass2));

指示 SomeProperty 应该始终反序列化为 SomeClass2 (当然,它实现了接口)。

但我在模型上没找到这样的方法。

I have this property:

public class SomeClass
{
  public ISomeInterface SomeProperty { get;set; }
}

Now, ISomeInterface in this particular context can only be a specific concrete type, like SomeClass2. Can I do it without the ProtoInclude attribute?

I thought I can do something like this:

model.Add(typeof(SomeClass), true).Add(1, "SomeProperty", typeof(SomeClass2));

Indicating, that SomeProperty should always be deserialized as SomeClass2 (which, of course, implements the interface).

But I failed to find a method like this on the model.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼眸里的快感 2024-11-16 11:16:48

你是来考验我的;p

那不是直接暴露的;谷歌目前不允许我提交,但一旦我可以提交,以下内容就会起作用:

[Test]
public void ExposeInterfaceWithDefaultImplementation()
{
    var model = TypeModel.Create();
    // note the following sets for the ConstructType for the ISomeInferface, not specifically for Foo
    model.Add(typeof(ISomeInterface), false).Add("Foo").ConstructType = typeof(SomeClass2);
    model.Add(typeof(SomeClass), false).Add("SomeProperty");

    var orig = new SomeClass();
    orig.SomeProperty = new SomeClass2();
    orig.SomeProperty.Foo = 123;
    var clone = (SomeClass)model.DeepClone(orig);
    Assert.AreEqual(123, clone.SomeProperty.Foo);
}

You are out to test me ;p

That wasn't directly exposed; google isn't letting me commit at the moment, but the following will work as soon as I can commit:

[Test]
public void ExposeInterfaceWithDefaultImplementation()
{
    var model = TypeModel.Create();
    // note the following sets for the ConstructType for the ISomeInferface, not specifically for Foo
    model.Add(typeof(ISomeInterface), false).Add("Foo").ConstructType = typeof(SomeClass2);
    model.Add(typeof(SomeClass), false).Add("SomeProperty");

    var orig = new SomeClass();
    orig.SomeProperty = new SomeClass2();
    orig.SomeProperty.Foo = 123;
    var clone = (SomeClass)model.DeepClone(orig);
    Assert.AreEqual(123, clone.SomeProperty.Foo);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文