Это основной проект .net, работающий на Mac. У меня есть собственный класс Exception, который я сериализую как JSON в качестве вывода в случае ошибки.

  public class HttpException : Exception {
    private readonly int statusCode;

    public HttpException() {}

    public HttpException(int statusCode, string message) : base(message) {
        this.statusCode = statusCode;
    }

    public int StatusCode {get {return this.statusCode;}}
}

Код, связанный с сериализацией json

Exception exception = (Exception)serviceRequest.ResultData;
MemoryStream memoryStream = new MemoryStream();  
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(Exception));  


// it fails here
dataContractJsonSerializer.WriteObject(memoryStream, exception);  


byte[] json = memoryStream.ToArray();  
memoryStream.Close();  
Console.WriteLine(Encoding.UTF8.GetString(json, 0, json.Length));

System.Runtime.Serialization.SerializationException: введите 'Service.Model.Exceptions.HttpException' с именем контракта данных 'HttpException: http://schemas.datacontract.org/2004/07/Service.Model.Exceptions 'не ожидается. Добавьте любые типы, которые не известны статически, в список известных типов, например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданный в DataContractSerializer. в System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType (DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandlehibitedTypeHandle, Type объявленныйType)

Изменить

Попытка использовать System.Web.Extensions, но есть волнистые линии.

enter image description here

0
App2015 14 Мар 2018 в 00:14

2 ответа

Лучший ответ

Я хочу, но я не могу выйти за пределы сторонних библиотек, только нативные реализации из-за некоторых требований.

Вы можете включить библиотеку System.Web.Extensions и использовать JavaScriptSerializer

var ser = new JavaScriptSerializer();
string json = ser.Serialize(exception);

Но, как я сказал в комментариях, я бы предпочел Json.Net

0
Eser 13 Мар 2018 в 21:31

System.Web.Extensions не поддерживается в .Net Core, но вы можете использовать пакет Nuget Newtonsoft.Json. Один из этих двух методов должен помочь:

Newtonsoft.Json.JsonConvert.DeserializeObject(string value)
Newtonsoft.Json.JsonConvert.DeserializeObject<T>(string value)

Я столкнулся с аналогичной проблемой при переносе модульных тестов с .Net 4.6.1 на .Net Core.

Кстати, если вы получаете какие-либо странные исключения времени выполнения, найдите экземпляры JavaScriptSerializer и замените их соответствующими методами Newtonsoft.Json.

0
Adriang 24 Окт 2018 в 13:03