【问题标题】:How to serialize non-static child class of static class如何序列化静态类的非静态子类
【发布时间】:2011-05-27 15:51:15
【问题描述】:

我想序列化一个非常普通的类,但问题是它嵌套在这样的静态类中:

public static class StaticClass
{
    [Serializable]
    public class SomeType
    {
        ...
    }
}

这段代码:

StaticClass.SomeType obj = new StaticClass.SomeType();
XmlSerializer mySerializer = new XmlSerializer(typeof(obj));

产生这个错误:

StaticClass.SomeType cannot be serialized. Static types cannot be used as parameters or return types.

这个错误似乎完全无关; StaticClass.SomeType 不是静态类型。

有没有办法解决这个问题?我认为这个错误很愚蠢是不是错了?

【问题讨论】:

标签: c# serialization static-classes


【解决方案1】:

要么将类设为非嵌套类,要么考虑改用DataContractSerializer

【讨论】:

    【解决方案2】:

    知道limitation in XmlSerializer()

    解决方法是使用DataContractSerializer (DataContractAttribute + DataMemberAttribute)

    var ser = new DataContractSerializer(typeof (StaticClass.SomeType));
    var obj = new StaticClass.SomeType {Int = 2};
    ser.WriteObject(stream, obj);
    
    ...
    
    static class StaticClass
    {
        [DataContract]
        public class SomeType
        {
            [DataMember]
            public int Int { get; set; }
        }
    }
    

    如您所见,DataContractSerializer 甚至不需要 StaticClass 公开。一个区别是您应该使用 WriteObject' andReadObject' 而不是 SerializeDeserialize

    【讨论】:

      【解决方案3】:

      作为一种实用的解决方法 - 不要标记嵌套类型static

      public class ContainerClass
      {
          private ContainerClass() { // hide the public ctor
              throw new InvalidOperationException("no you don't");
          }
      
          public class SomeType
          {
              ...
          }
      }
      

      【讨论】:

      • 作为 XmlSerializer 限制的解决方法,这对我来说是最实用的。谢谢:)
      • +1 简单有效。如果我要这样做,我也会将课程标记为密封。让我想起了旧的 .NET 1 天(密封类和私有构造函数)
      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多