[英]How to prevent an entire class from being serialized?
我正在使用Newtonsoft.Json來序列化一個類及其所有成員。 有一個特定的類,它的許多成員是一個實例,我只想告訴一個類根本不被序列化,所以如果任何成員是該類型的實例被跳過。
這是否可以在C#中通過將某種屬性附加到類來將其標記為不可序列化?
我不認為這可以使用類上的屬性來完成。 但是,您應該能夠通過實現自定義JsonConverter
來實現,該自定義JsonConverter
始終將此類的任何實例序列化和反序列化為null
。 此代碼實現了這樣的行為:
class IgnoringConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteNull();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return null;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ClassToIgnore);
}
}
在此示例中, ClassToIgnore
是您希望在序列化期間忽略的類。 這些類應該使用JsonConverter
屬性進行修飾:
[JsonConverter(typeof(IgnoringConverter))]
class ClassToIgnore
您還可以將轉換器注冊為默認轉換器 ,如果您使用的是ASP.NET Web API,則該轉換器非常有用。
我已經包含一個Console應用程序示例來演示功能:
using System;
using Newtonsoft.Json;
/// <summary>
/// Class we want to serialize.
/// </summary>
class ClassToSerialize
{
public string MyString { get; set; } = "Hello, serializer!";
public int MyInt { get; set; } = 9;
/// <summary>
/// This will be null after serializing or deserializing.
/// </summary>
public ClassToIgnore IgnoredMember { get; set; } = new ClassToIgnore();
}
/// <summary>
/// Ignore instances of this class.
/// </summary>
[JsonConverter(typeof(IgnoringConverter))]
class ClassToIgnore
{
public string NonSerializedString { get; set; } = "This should not be serialized.";
}
class IgnoringConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteNull();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return null;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ClassToIgnore);
}
}
class Program
{
static void Main(string[] args)
{
var obj = new ClassToSerialize();
var json = JsonConvert.SerializeObject(obj);
Console.WriteLine(json);
obj = JsonConvert.DeserializeObject<ClassToSerialize>(json);
// note that obj.IgnoredMember == null at this point
Console.ReadKey();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.