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

有没有解决的办法?我认为这个错误是愚蠢的,我错了吗?

4

3 回答 3

8

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

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

    public class SomeType
    {
        ...
    }
}
于 2010-12-18T20:06:34.733 回答
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公开。一个区别是您应该使用WriteObject' andReadObject' 而Serialize不是Deserialize

于 2010-12-18T19:55:50.283 回答
1

要么使类非嵌套,要么考虑改用DataContractSerializer

于 2010-12-18T19:52:18.473 回答