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パブリックである必要さえありません。1 つの違いは、代わりに ReadObject' を使用する必要があることですWriteObject' andSerializeDeserialize

于 2010-12-18T19:55:50.283 に答える
1

クラスをネストしないようにするか、代わりにDataContractSerializerの使用を検討してください。

于 2010-12-18T19:52:18.473 に答える