2016-09-07 4 views
0

Wir haben ein schwerwiegendes Problem mit einem benutzerdefinierten generischen Typ, der Ausnahmen bezüglich der Serialisierung auslöst. Hier ist ein Beispiel-Klasse:Hinzufügen von Laufzeitanweisungen für generische Typen in der UWP-App

internal class Foo<T> : IFoo<T> 
{ 
    public void Bar(T tralalala) 
    { 
     //do whatever 
    } 
} 

Nun, wir mit dem Prism-Framework und seine eingebaute in SessionStateService die App Zustand zu speichern, wenn es heruntergefahren oder ausgesetzt wird. Das Problem ist, wenn Prism versucht, den App-Status nach dem erneuten Start zu bringen, wird eine Ausnahme ausgelöst:

System.Runtime.Serialization.InvalidDataContractException 
SerializationCodeIsMissingForType, Utilities.Foo.Foo`1[T] 

Ich bin mir sehr wohl bewusst, dass für den Serializer/Deserializer, um die .NET native Compiler zu arbeiten, benötigt zusätzliche Metadaten für den Typ, wie in den rd.xml-Dateien angegeben. Das Problem ist, ich habe keine Ideen, wie man diesen Typ markiert. Ich dachte, einen allgemeiner Tag für die ganze Namespace funktionieren würde:

<Namespace Name="Utilities.Foo" Dynamic="Required All" DataContractSerializer="Required All" /> 

Aber das ist nicht der Fall, und ich kann wirklich keine Beispiele finden, wie man richtig einen generischen Typen zu markieren. Da dieses Serialisierungs-/Deserialisierungsproblem es unmöglich macht, den WACK-Test zu bestehen, müssen wir das Problem wirklich lösen. Hilf mir, Stack Overflow, du bist meine einzige Hoffnung.

+1

Ich habe einige Leute aus dem .NET-Serialisierungsteam gepingt. Ich bin mir sicher, wir können dich ins Quadrat bringen. Für solche Dinge können Sie uns jederzeit unter [email protected] kontaktieren. Freue mich zu helfen! –

+0

Tritt das Problem auf, wenn Sie Ihre App mit oder ohne .NET Native Toolchain kompilieren? –

Antwort

0

Sie können das Element <TypeInstantiation> verwenden, um die Reflexionsrichtlinie auf generische Typen zu setzen. Einzelheiten finden Sie unter https://msdn.microsoft.com/en-us/library/dn627487(v=vs.110).aspx.

Zum Beispiel, hier ist die rd.xml Datei, die ich für Foo hatte,

<?xml version="1.0" encoding="utf-8" ?> 
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> 
    <Application> 
    <Assembly Name="*Application*" Dynamic="Required All" /> 
    <TypeInstantiation Name="Foo" 
         Arguments="System.Int32" 
         DataContractSerializer="Required All" /> 
    <TypeInstantiation Name="Foo" 
         Arguments="System.String" 
         DataContractSerializer="Required All" /> 
    </Application> 
</Directives> 

Mein Test-App getestet Foo<int> und Foo<string>, so hatte ich zwei TypeInstantiation Einträge mit unterschiedlichen Arguments Attributwerte wie oben gezeigt.

Oder Sie können das Element verwenden unter die Richtlinie auf alle Foo<T> Typen anzuwenden,

<TypeInstantiation Name="Foo" DataContractSerializer="Required All" /> 

Beachten Sie, dass das Element nicht Arguments Attribut hat.

+0

Ich möchte etwas zusätzlichen Kontext hinzufügen, da ich schon einige Zeit mit dem Thema verbracht habe. –

+0

Und ich habe es tatsächlich geschafft, es zu senden, bevor ich meinen Kommentar beende. Der Fall hier war komplizierter - wir haben unsere eigene Implementation des Weak Event-Patterns, eher reflektionslastig, benutzt, um zu serialisieren, was dazu führen würde, dass der SessionStateService drunter und drüber ging. Wir haben es vom UWP Toolkit auf einen WeekEventListener umgestellt und es ist jetzt in Ordnung. Das obige Beispiel war hilfreich bei anderen generischen Typen, also vielen Dank. –