XmlSerializer ведет себя по-разному с частным геттером свойства в .net framework и .net core - PullRequest
4 голосов
/ 17 октября 2019

Я использовал сторонний пакет nuget, который поддерживал ядро ​​.net и .net framework (стандарт .net).

Мой проект был проектом .net Framework 4.62, и когда я использовал этот третийсторона, я получил исключение от XmlSerializer.

Проблема была связана с частным получателем в свойстве.

Только сериальные свойства и поля могут быть сериализованы. Свойства должны иметь открытые методы доступа (методы get и set). Если вам нужно сериализовать непубличные данные, используйте класс BinaryFormatter, а не сериализацию XML.

Полный источник

После получения этой ошибки я попыталсяоткройте проект .net core 2.2, используйте тот же сторонний nuget и увидите, что там работает тот же код.

Это небольшой пример кода, который воспроизводит проблему:

public class Test
{
    public string TestProp { private get; set; }
}

// Exception on .net 462 and works on .net core 2.2
var serializer = XmlSerializer.FromTypes(new[] { typeof(Test) });

Итак, это ошибка в реализации ядра .net или функция? Могу ли я что-нибудь сделать, чтобы поддержать это в .net framework без разветвления репозитория и исправления кода?

1 Ответ

2 голосов
/ 17 октября 2019

«Ошибка» заключается в том, что она выходит из строя в другое время;на net462 происходит сбой во время FromTypesnetcoreapp2.2 и netcoreapp3.0 происходит сбой во время Serialize с:

System.InvalidOperationException: при создании документа XML возникла ошибка. ---> System.MethodAccessException: попытка метода «Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTest.Write2_Test (System.String, System.String, Test, Boolean, Boolean)» для доступа к методу «Test.get_TestProp ()» не удалась

Так что ... об этом действительно не стоит беспокоиться, ИМО. Нет реальной разницы feature , под которой я подразумеваю: она не будет работать 1014 * в любом случае. Так что просто ... не делайте этого?

Но: вы можете зарегистрировать это как ошибку на github и даже отправить PR, чтобы он потерпел неудачу раньше, если вы действительно хотите.

Тем не менее: если вы добавите:

public bool ShouldSerializeTestProp() => false;

, тогда будет работать на netcoreapp2.2 и netcoreapp3.0, что ... хорошо, я думаю? И даже можно считать причиной , а не , чтобы изменить новое поведение.

...