序列化中的Json.net和JsonIgnore



我有一个具有Serializable属性的对象,该类继承自抽象类,该抽象类继承自其他类,该类也继承自接口的Serializable

我用过

 string included = JsonConvert.SerializeObject(msg,
                              Formatting.Indented,
                              new JsonSerializerSettings { /*ContractResolver = new NotificationPropertyResolver()*/ TypeNameHandling  = TypeNameHandling.All});

由于msg是接口我想在SignalR中发送这个对象,我看到它不会忽略任何成员,我已经装饰了界面和类

有解决方案吗?我也尝试过使用具有自己属性的解析器,但结果仍然相同

班级很大,但是。。。

 [Serializable]
[WebAPINotification(Type = typeof(CSensor), Group = "Sensor")]
public class SensorsStateModeNotification : SensorNotification, IBPMPackagedNotification
public abstract class SensorNotification : BasicLanNotification, ISensNotification
[Serializable]
public class BasicLanNotification : BasicNotification, ILanNotification
[Serializable]
public abstract class BasicNotification : INotification, ISerializable, IOpSerializable
[JsonIgnore]
    public long SentAt 
    {
        get
        {
            return m_sentAt;
        }
        set
        {
            m_sentAt = value;
        }
    }
    /// <summary>
    /// 
    /// </summary>
    [JsonIgnore]
    public ENotificationGateway NotificationGateway
    {
        get
        {
            return m_NotifyGateway;
        }
        set
        {
            m_NotifyGateway = value;
        }
    }

您的类型实现了ISerializable接口,该接口优先于属性。如果您不想序列化类的成员,那么就不要在ISerializable.GetObjectData实现中返回它们。请参阅下面的SSCCE(顺便说一句,将来如果你想要更好的答案,你也应该提供一个)作为例子。

public class StackOverflow_18127665
{
    public class WebAPINotificationAttribute : Attribute
    {
        public Type Type { get; set; }
        public string Group { get; set; }
    }
    public class CSensor { }
    public interface INotification { }
    public interface IOpSerializable { }
    public interface IBPMPackagedNotification { }
    public interface ILanNotification { }
    public interface ISensNotification { }
    [Serializable]
    [WebAPINotification(Type = typeof(CSensor), Group = "Sensor")]
    public class SensorsStateModeNotification : SensorNotification, IBPMPackagedNotification { }
    public abstract class SensorNotification : BasicLanNotification, ISensNotification { }
    [Serializable]
    public class BasicLanNotification : BasicNotification, ILanNotification { }
    [Serializable]
    public abstract class BasicNotification : INotification, ISerializable, IOpSerializable
    {
        long m_sentAt;
        ENotificationGateway m_NotifyGateway;
        [JsonIgnore]
        public long SentAt
        {
            get
            {
                return m_sentAt;
            }
            set
            {
                m_sentAt = value;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        [JsonIgnore]
        public ENotificationGateway NotificationGateway
        {
            get
            {
                return m_NotifyGateway;
            }
            set
            {
                m_NotifyGateway = value;
            }
        }
        #region ISerializable Members
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // Comment the lines below not to have this serialized
            info.AddValue("NotificationGateway", this.NotificationGateway);
            info.AddValue("SentAt", this.SentAt);
        }
        #endregion
    }
    public enum ENotificationGateway { First, Second }
    public static void Test()
    {
        BasicNotification msg = new BasicLanNotification
        {
            SentAt = 123,
            NotificationGateway = ENotificationGateway.First
        };
        var str = JsonConvert.SerializeObject(
            msg,
            Newtonsoft.Json.Formatting.Indented,
            new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            });
        Console.WriteLine(str);
    }
}
public class NotificationPropertyResolver : DefaultContractResolver
    {
        public NotificationPropertyResolver()
        {
            IgnoreSerializableAttribute = true;
            IgnoreSerializableInterface = true;
        }
    }

相关内容

  • 没有找到相关文章

最新更新