【问题标题】:Cleanest way to add KnowType from other assambly从另一个程序集中添加已知类型的最简洁方法
【发布时间】:2013-08-01 21:12:17
【问题描述】:

我有一个基类 BaseClass 和一个派生类 DerivedClass 在两个 dinstinct 程序集中。我正在使用以下方法(T=BaseClass)序列化DerivedClass 的实例:

    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 的已知类型列表中。

如何在不更改序列化方法的情况下序列化DerivedClass 的实例? (记住: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) };
            }

【问题讨论】:

    标签: c# datacontractserializer datacontract


    【解决方案1】:

    发件人:

    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;
        }
    }
    

    类型.txt: NameSpace.MyType,MyAssembly,版本=1.0.0.0,文化=中性,PublicKeyToken=null NameSpace.MyOtherType, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

    你也可以看这里:

    How do you configure WCF known types programmatically?

    【讨论】:

    • 这不仅适用于 ServiceContract 吗?
    • 我不知道。问题(我认为)是您的基类(在它自己的程序集中)需要了解您继承的类(在单独的程序集中)。这就是提出问题的问题。所以在某个地方,你必须做一些“松散的关联”,因为你的基类程序集不能引用你的继承类程序集(或者它会导致循环引用).......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多