Как сделать, чтобы AlwaysSerialize * () применялся только к XML, а не к JSON-сериализации? - PullRequest
0 голосов
/ 10 января 2019

Я использую метод ShouldSerialize для условной сериализации поля при использовании XmlSerializer. Но теперь мне нужно сериализовать тот же класс с использованием JSON, но я бы хотел, чтобы метод ShoulSerialize игнорировался при использовании JSON, могу ли я сделать это каким-либо образом?

[TestClass]
public class UnitTest1
{
    private readonly Customer _customer = new Customer
        {
            FirstName = "Paulo",
            LastName = "Balbino",
            Age = 25
        };

    [Serializable]
    public class Customer
    {
        [XmlElement("FirstName")]
        public string FirstName { get; set; }

        [XmlElement("LastName")]
        public string LastName { get; set; }

        [XmlElement("Age")]
        public int Age { get; set; }

        public bool ShouldSerializeLastName()
        {
            return Age > 30; // Enter here only if it is XmlSerialize.
        }
    }

    [TestMethod]
    public void XmlSerialize()
    {
        try
        {
            var xmlSerializer = new XmlSerializer(typeof(Customer));

            using (var textWriter = new StringWriter())
            {
                xmlSerializer.Serialize(textWriter, _customer);
                Debug.WriteLine(textWriter.ToString());
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }

    [TestMethod]
    public void JsonConvert()
    {
        try
        {
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(_customer);
            Debug.WriteLine(json);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }
}

Результат Xml:

<?xml version="1.0" encoding="utf-16"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>Paulo</FirstName>
  <Age>25</Age>
</Customer>

Результат Json:

{"FirstName":"Paulo","Age":25}

Оба идут к методу ShouldSerializeLastName(), однако я бы хотел, чтобы он игнорировался в JSON и отображались все поля.

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете отключить поддержку Json.NET для ShouldSerialize*() условной сериализации , используя собственный распознаватель контрактов и настройку DefaultContractResolver.IgnoreShouldSerializeMembers = true.

Сначала выделите резолвер контракта следующим образом:

static DefaultContractResolver IgnoreShouldSerializeContractResolver = new DefaultContractResolver
{
    IgnoreShouldSerializeMembers = true,
    //Set other properties as required, e.g.:
    //NamingStrategy = new CamelCaseNamingStrategy(),
};

Затем используйте его следующим образом:

var settings = new JsonSerializerSettings
{
    ContractResolver = IgnoreShouldSerializeContractResolver,
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(_customer, settings);

Примечания:

  • Возможно, вы захотите кэшировать контракт для лучшей производительности, так как он генерирует информацию о контракте для каждого типа только один раз, а затем кэширует ее.

  • Поскольку распознаватель контрактов кэширует информацию о типе, изменение свойств ранее существующего распознавателя договоров после его создания и использования для генерации договоров не рекомендуется.

  • IgnoreShouldSerializeMembers был представлен в Json.NET 11.0.1 .

Образец скрипки здесь .

...