我正在使用 Autorest 生成代码来调用我的 api。
我想在我的单元测试中使用以下内容
private JobHeaderRequestObject MakeRequestFromResponse(JobHeaderResponseObject InResponseObject)
{
// make use of the fact that in the server side code we know JobHeaderResponseObject inherits from JobHeaderRequestObject
return MySerializer.DeepConvert<JobHeaderResponseObject,JobHeaderRequestObject>(InResponseObject);
}
internal class MySerializer
{
public static T2 DeepConvert<T1,T2>(T1 obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T2)formatter.Deserialize(ms);
}
}
}
但是,当我尝试运行此代码时,我收到一个错误提示
System.Runtime.Serialization.SerializationException
表示类型
is not marked as serializable
我不想通过生成的代码添加属性
[可序列化]
每种类型,因为下次生成时代码将被覆盖。
我在Git Hub 项目上查看了这个问题,它提到
如果招摇规范有这样的模型定义
{
"Foo": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "number"
}
},
"additionalProperties": {
"type": "string"
}
}
}
那么 Autorest 生成的 SDK 应该能够正确地序列化和反序列化(往返)未知属性。
今天,生成的 C# 客户端通过 Dictionary AdditionalProperties 支持这一点。
所以现在我想了解什么是 Autorest 规范以及我是如何设置它的。
在 startup.cs 我有配置
app.UseSwagger(c =>
{
c.RouteTemplate =
"api-docs/{documentName}/swagger.json";
});
app.UseSwaggerUI(c =>
{
//Include virtual directory if site is configured so
c.RoutePrefix = "api-docs";
c.SwaggerEndpoint("./v1/swagger.json", "Api v1");
});
在 ConfigureServices 我有
services.AddSwaggerGen(c =>
{
c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "My API",
Description = "ASP.NET Core Web API",
TermsOfService = "None",
Contact = new Swashbuckle.AspNetCore.Swagger.Contact
{
Name = "MyName",
Email = "MyEmail@Mydomain.com"
}
});
c.EnableAnnotations();
c.DescribeAllEnumsAsStrings();
c.ParameterFilter<SwaggerEnumParameterFilter>();
c.SchemaFilter<SwaggerEnumFilter>();
});