0

我正在使用 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>();
        });
4

0 回答 0