如何序列化静态类的非静态子类

11

我想序列化一个很普通的类,但问题在于它嵌套在一个静态类中,就像这样:

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不是静态类型。

有什么解决这个问题的方法吗?我错了认为这个错误很蠢吗?


6
顺便说一句,[Serializable] 在这里没有任何作用 - XmlSerializer 不使用它。 - Marc Gravell
2
已经在Connect上报告了:https://connect.microsoft.com/VisualStudio/feedback/details/523204/class-that-is-nested-in-static-class-cannot-be-xml-serialized - Thomas Levesque
3个回答

8

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

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

    public class SomeType
    {
        ...
    }
}

作为XmlSerializer限制的一种解决方法,这对我来说是最实用的。谢谢 :) - tenfour
1
+1 简单而有效。如果我要做这个,我也会将类标记为sealed。这让我想起了旧的.NET 1时代(封闭类和私有构造函数)。 - RichardOD

4

已知在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是公共的。一个区别是您应该使用WriteObjectReadObject而不是SerializeDeserialize


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接