2

.netプロジェクトで使用する必要のあるクラスを実装するSilverLightlib(dll)があります。この回答で説明されている手順に従いましたが、プロキシライブラリを使用して必要なクラスを公開する方法がわかりません。.netプロジェクトにプロキシへの参照を追加しました。dllはSilverlight5用で、.net4.0を使用しています。

dllを参照として追加するだけで、SLオブジェクトを使用できますが、シリアル化できません。

問題のあるコードは次のとおりです。

    static string SerializeWithDCS(object obj)
    {
        if (obj == null) throw new ArgumentNullException("obj");
        DataContractSerializer dcs = new DataContractSerializer(obj.GetType());
        MemoryStream ms = new MemoryStream();
        dcs.WriteObject(ms, obj);
        return Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Position);
    }

シリアル化は次の場合に失敗します:

System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime.Serialization, Versio
n=5.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. The system ca
nnot find the file specified.                                                                         
File name: 'System.Runtime.Serialization, Version=5.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea
7798e'                                                                                                
   at System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int
32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type)            
   at System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeType
Handle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext)                    
   at System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Ty
pe[] genericMethodArguments)                                                                          
   at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, Me
tadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decora
tedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList deriv
edAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolea
n& isVarArg)                                                                                          
   at System.Reflection.CustomAttribute.IsCustomAttributeDefined(RuntimeModule decoratedModule, Int32 
decoratedMetadataToken, RuntimeType attributeFilterType, Boolean mustBeInheritable)                   
   at System.Reflection.CustomAttribute.IsDefined(RuntimeType type, RuntimeType caType, Boolean inheri
t)                                                                                                    
   at System.RuntimeType.IsDefined(Type attributeType, Boolean inherit)                               
   at System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(Type type, Boolean t
ryCreate, DataContract& dataContract, Type& itemType, Boolean constructorRequired)                    
   at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id
, RuntimeTypeHandle typeHandle, Type type)                                                            
   at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidati
on(Int32 id, RuntimeTypeHandle typeHandle, Type type)    
4

1 に答える 1

0

リフレクションを使用して独自のシリアル化を記述します。

それが私が思いつく最善の解決策です - より良い人が優れた答えを提供してくれますように。

問題は、.NET と Silverlight の間で異なる System.Runtime.Serialization の属性にあるようです。これは、Anders Gustafsson によってリンクされた質問で話されました。

なぜこれを機能させることができなかったのか、私は困惑しています。

AppDomain を作成して、必要なアセンブリをすべてロードしようとしました。

  1. サードパーティ アセンブリを装ったテスト dll、
  2. シリアル化を行う Silverlight ラッパー アセンブリ
  3. すべての Silverlight 5 コア アセンブリと
  4. System.Runtime.Serialization の Silverlight 5 バリアント。

次に、シリアル化を呼び出すラッパー アセンブリ内のコードを呼び出しましたが、それでも例外が発生しました。

不可解です - そして多分私は何か間違ったことをしただけです.

詳しい人がこれについて何か言いたいことがあれば、私は非常に興味があります。

いずれにせよ、カスタム シリアライザーを作成すること可能であり、これで問題が解決すると思います。

于 2014-01-12T01:51:43.407 に答える