1

私は基本クラスBaseClassと派生クラスをDerivedClass2 つの異なるアセンブリに持っています。DerivedClass次のメソッド (T= BaseClass)を使用してのインスタンスをシリアル化しています。

    public static string SerializeDataContract<T>(T obj)
    {
        using (var stream = new MemoryStream())
        {
            using (var reader = new StreamReader(stream))
            {
                var serializer = new DataContractSerializer(typeof(T));
                serializer.WriteObject(stream, obj);
                stream.Position = 0;
                return reader.ReadToEnd();
            }
        }
    }

次の例外が発生しました: SerializationException : 既知の型のリストに静的に不明な型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。

DerivedClassSerialization メソッドを変更せずにのインスタンスをシリアル化するにはどうすればよいですか? (覚えておいてください: DerivedClass は他のアセンブリにあります)

私は現在以下を使用していますが、私は大ファンではありません。いくつかのアイデア?

    //In base class
        [KnownType("GetKnownType")]
        public abstract class GetcReceiverContextBase
        {
            public static event Func<IEnumerable<Type>> KnownTypeRequired;

            private static IEnumerable<Type> GetKnownType()
            {
                var types = new List<Type>();
                if (KnownTypeRequired != null)
                    return KnownTypeRequired();

                return types.ToArray();
            }


//In derived Class
      public class DerivedClass : BaseClass
        {
            static MT514ContextMock()
            {
                KnownTypeRequired += () => new List<Type> { typeof(MT514ContextMock) };
            }
4

1 に答える 1

0

から:

http://social.msdn.microsoft.com/Forums/vstudio/en-US/6b70e9f4-52bc-4fa9-a0ff-c0859e041e85/how-to-configure-serviceknowntype-in​​-appconfig

以下は投稿からの引用です (リンクが切れた場合に備えて) が、上記のリンクには追加の議論があります。

[ServiceKnownType("GetKnownTypes", typeof(Helper))] 属性を使用するだけで、GetKnownTypes メソッドでファイルから AssemblyQualifiedNames を読み取って型を返すことができます。

[ServiceKnownType("GetKnownTypes", typeof(Helper))]
public interface MyService
{
    ...
}

static class Helper
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
        List<Type> knownTypes = new List<System.Type>();
        // Add any types to include here.           
        string[] types = File.ReadAllLines(@"..\..\..\types.txt");
        foreach (string type in types)
        {
            knownTypes.Add(Type.GetType(type));
        }

        return knownTypes;
    }
}

types.txt: NameSpace.MyType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null NameSpace.MyOtherType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

ここでも見ることができます:

プログラムで WCF の既知の型をどのように構成しますか?

于 2013-08-01T13:09:36.263 に答える