小编dav*_*bak的帖子

杰克逊的@JsonSubTypes仍然是多态反序列化所必需的吗?

我能够序列化和反序列化抽象基类注释的类层次结构

@JsonTypeInfo(
    use = JsonTypeInfo.Id.MINIMAL_CLASS,
    include = JsonTypeInfo.As.PROPERTY,
    property = "@class")
Run Code Online (Sandbox Code Playgroud)

但没有@JsonSubTypes列出子类,子类本身相对未注释,只有一个@JsonCreator在构造函数上.ObjectMapper是vanilla,我没有使用mixin.

关于PolymorphicDeserialization和"type id"的 Jackson文档建议(强烈地)我需要在@JsonSubTypes抽象基类上使用注释,或者在mixin上使用它,或者我需要使用ObjectMapper注册子类型.并且有很多SO问题和/或博客帖子都同意.但它确实有效.(这是Jackson 2.6.0.)

那么......我是一个尚未记录的功能的受益者,还是我依赖​​于无证件行为(可能会改变)或是其他事情还在继续?(我问,因为我真的不希望它成为后两者中的任何一个.但我知道.)

编辑:添加代码 - 和一个评论.评论是:我应该提到我反序列化的所有子类都与基本抽象类在同一个包和同一个jar中.

抽象基类:

package so;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(
    use = JsonTypeInfo.Id.MINIMAL_CLASS,
    include = JsonTypeInfo.As.PROPERTY,
    property = "@class")
public abstract class PolyBase
{
    public PolyBase() { }

    @Override
    public abstract boolean equals(Object obj);
}
Run Code Online (Sandbox Code Playgroud)

它的一个子类:

package so;
import org.apache.commons.lang3.builder.EqualsBuilder;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public final class SubA extends PolyBase
{ …
Run Code Online (Sandbox Code Playgroud)

java json jackson json-deserialization

43
推荐指数
1
解决办法
4万
查看次数

Visual Studio 2019 git 问题:在获取/推送时“无法生成... ssh.exe:没有这样的文件或目录”

无法让 VS2019 获取/推送到远程(恰好在 GitLab 上)。什么是正确的配置?

  1. 我正在使用内置的 Windows 10 OpenSSH ( C:\Windows\System32\OpenSSH)

  2. 我已经设置了环境变量GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe

  3. 私钥ssh-agent通过加载到正在运行的服务中ssh-add

  4. 从普通的命令窗口(即不是 WSL bash shell)我可以按我的心高兴地推送/获取。

  5. 从 VS2019 开始,打开存储库 ( Git>Local Repositories>myrepo),当我尝试Git>FetchGit>Push在输出窗口中看到以下内容:

    Commit eebc0b4a created locally in repository r:\bbits\edu-bitcoin-staging
    Opening repositories:
    r:\bbits\edu-bitcoin-staging
    Pushing master
    Pushing to gitlab.com:bakins-bits/edu-bitcoin-staging.git
    Error: cannot spawn C:\Windows\System32\OpenSSH\ssh.exe: No such file or directory
    Error encountered while pushing to the remote repository: Git failed with a fatal error.
    Git failed with a fatal error.
    unable to …
    Run Code Online (Sandbox Code Playgroud)

git openssh visual-studio visual-studio-2019

8
推荐指数
3
解决办法
4367
查看次数

如何在TPL Dataflow中设置/获取/使用块的名称?

MSDN文档显示该类有一个NameFormat属性DataflowBlockOptions,描述如下:

获取或设置在查询块名称时使用的格式字符串.

那么......你怎么设置这个名字?这个名字怎么样?什么时候使用?

或者......正如我怀疑的那样......这只是一个实际上没有实现的设计残余?

.net c# task-parallel-library tpl-dataflow

7
推荐指数
1
解决办法
447
查看次数

给定一个字符串,找到两个具有连续索引C++的相同子序列

我需要构建一个算法(不一定有效),给定一个字符串找到并打印两个相同的子序列(通过print我的意思是颜色).此外,这两个子序列的索引集合的联合必须是一组连续的自然数(整数的整数).

在数学中,我正在寻找的东西被称为"紧身双胞胎",如果它有帮助的话.(例如,请参阅此处文件(PDF).)

我举几个例子:

1)考虑字符串231213231

它有两个子序列,我正在寻找"123"的形式.要看到它更好看这个图像:

231213231

第一个子序列标有下划线,第二个子序列标有上划线.如你所见,他们拥有我需要的所有属性.

2)考虑字符串12341234

12341234

3)考虑字符串12132344.

现在它变得更加复杂:

在此输入图像描述

4)考虑字符串:13412342

它也不是那么容易:

在此输入图像描述

我认为这些例子很好地解释了我的意思.

我一直在思考一个可以做到这一点但却没有成功的算法.

为了着色,我想使用这段代码:

 using namespace std;
HANDLE  hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, k);
Run Code Online (Sandbox Code Playgroud)

其中k是颜色.

任何帮助,甚至提示,都将受到高度赞赏.

c++ algorithm

7
推荐指数
1
解决办法
1133
查看次数

java.util.Comparator.naturalOrder采用<T extends Comparable <?超级T >>并返回比较器<T> - 为什么?

(如果这是重复的,请指出我正确的答案!我搜索并阅读了几个(> 5)相关问题,但似乎没有出现在标记上.还查看了泛型常见问题和其他来源...)

显然这是一种正确的做法,当集合类使用比较器时,它应该具有Comparator<? super T>参数化类型的类型T.你可以看到很多地方,例如TreeMap.好的.

我的问题是使用Comparator.naturalOrder()哪个参数化,T extends Comparable<? super T>但返回一个Comparator<T>.我正在尝试在我的集合类中有一个字段,它包含用户指定的比较器或Comparator.naturalOrder比较器.

我无法让它发挥作用.我的问题都是相关的:

  1. 如何Comparator.naturalOrder正确使用?
    • 我可以做我想要的那个有存储用户提供的比较器或naturalOrder比较器的字段吗?
  2. 鉴于大多数集合类(在框架中)都T没有参数化T implements Comparable<? super T>,所以选择的设计模式是多么naturalOrder有用,因为它需要后一个有界通配符,而不是无约束类型参数?

谢谢!

下面是编译器错误的实际示例:

所以:如果我在某些类中有这样的代码,其中T没有边界(如在所有现有的集合类中):

class Foo<T> {

    private Comparator<? super T> comparator;

    public void someMethod(Comparator<? super T> comparator)
    {
        this.comparator = comparator;                  // no compile error
        this.comparator = Comparator.naturalOrder();   // incompatible types
    }
}
Run Code Online (Sandbox Code Playgroud)

有这个错误:

Error:(331, 50) java: incompatible …
Run Code Online (Sandbox Code Playgroud)

java generics comparator java-8 bounded-wildcard

6
推荐指数
1
解决办法
3020
查看次数

如何使用类型提示来注释生成器上的装饰器?

我正在使用生成器作为协程,如 David Beazley 的精彩三重演示(位于http://www.dabeaz.com/coroutines/)中所述,但我不知道如何输入装饰器consumer。这是我到目前为止所拥有的:

\n\n
from typing import Any, Callable, Generator, Iterable\n\nArbGenerator = Generator[Any, Any, Any]\n\ndef consumer(fn: \xe2\x9d\x93) -> \xe2\x9d\x93:\n    @wraps(fn)\n    def start(*args: Any) -> ArbGenerator:\n        c = fn(*args)\n        c.send(None)\n        return c\nreturn start\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用示例,略为:

\n\n
@consumer\ndef identity(target: ArbGenerator) -> ArbGenerator:\n    while True:\n        item = yield\n        target.send(item)\n\n@consumer\ndef logeach(label: Any, target: ArbGenerator) -> ArbGenerator:\n    while True:\n        item = yield\n        print(label, item)\n        target.send(item)\n\npipeline = identity(logeach("EXAMPLE", some_coroutine_sink()))\n
Run Code Online (Sandbox Code Playgroud)\n\n

粗体\xe2\x9d\x93标记了我不确定的地方 - 并且我也不确定我定义的类型ArbGenerator。(问题是,如果没有输入(装饰器)函数consumer本身,我不确定mypy是否使用该装饰器分析任何生成器函数,这就是我不确定的原因 …

python generator type-hinting python-3.x

6
推荐指数
1
解决办法
1544
查看次数

如何使用函数签名的 typedef 作为 std::function 的类型参数?

当用作模板类型参数时,函数的 typedef 和使用裸函数类型之间必须有区别。

即,考虑

#include <functional>

typedef std::function<void(int)> TF1;

typedef void(*FooFn)(int);
typedef std::function<FooFn>     TF2;

int main() {
    TF1 tf1;
    TF2 tf2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个TF1但不能创建一个TF2(错误:)aggregate 'TF2 tf2' has incomplete type and cannot be defined。(见ideone示例。)

有没有办法使用函数(签名)的 typedef 作为模板类型参数;具体来说,作为类型参数std::function

(没有 C++11 标签,因为我boost::function对非现代编译器也很感兴趣。但如果语言以某种方式改变以启用它,C++11 的答案也将不胜感激。)

c++ templates signature

5
推荐指数
1
解决办法
902
查看次数

ODR 和类型模板参数中的“相同的标记序列”以及“typename”与“class”

  • [免责声明#1:我实际上并不是指 C++ 标准;我指的是 C++ 标准。cppreference我指的是《定义和ODR(单一定义规则)》。]
  • [免责声明 #2:我实际上懒得尝试它,我通过参考标准 C++ 免责声明来捍卫这一点,即不需要诊断 ODR 违规行为,因此我可能不会通过尝试学到任何东西。 ]

C++ 标准(如上面#1 中所声明的)规定,不违反 ODR的要求之一是“每个定义都包含相同的标记序列”。

这看起来很清楚,除了我很好奇:

在声明模板的类型模板参数时,是否也typename不允许class在两个不同的定义(在两个不同的翻译单元等)中进行替换?

因为这些关键字通常是可以互换的。

(我知道在任何情况下都无法在模板参数中typename替换的特殊情况。)class

c++ language-lawyer

3
推荐指数
1
解决办法
94
查看次数

我可以从(旧式)函数签名中获取参数包吗?

我想声明一个方法 - 可变参数 - 它的签名来自作为模板参数的“旧式”函数签名。

您可以std::function使用函数签名声明,例如,

std::function<int(float,float)> f;
Run Code Online (Sandbox Code Playgroud)

现在我想要一个模板,它采用这样的函数签名并以某种方式声明一个方法:

template <typename F>
struct Foo {
   [F's-return-type] Method(F's-Arg-pack]...) { ... }
};
Run Code Online (Sandbox Code Playgroud)

因此,如果您按如下方式实例化它,您将获得如下方法:

   Foo<int(float,float)> foo;
   int x = foo.Method(1.0f, 2.0f);
Run Code Online (Sandbox Code Playgroud)

或者也许有不同的方法来做到这一点?

c++ variadic-functions variadic-templates c++17

0
推荐指数
1
解决办法
58
查看次数