0

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

我用过

 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;
        }
    }
4

2 回答 2

0
public class NotificationPropertyResolver : DefaultContractResolver
    {
        public NotificationPropertyResolver()
        {
            IgnoreSerializableAttribute = true;
            IgnoreSerializableInterface = true;
        }

    }
于 2013-08-09T03:55:17.180 回答
0

您的类型实现了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);
    }
}
于 2013-08-08T19:26:42.787 回答