Ihr grundlegendes Problem ist, dass DynamicType = true
nur für diese bestimmte Eigenschaft gilt und Typinformationen nur für den Wert dieser bestimmten Eigenschaft serialisiert. Es gilt nicht rekursiv für eine der Eigenschaften des Objekts. Allerdings ist Ihr object
Wert tief in mehreren Ebenen der Behälter verschachtelt:
public Dictionary<ContextActions, List<Tuple<string, List<object>>>> Value;
Was Sie tun müssen, ist Typinformationen für jeden object
in diesem Wörterbuch von Tupeln von Listen serialisieren. Sie können dies tun, indem Sie einen Ersatzwert Typ Einführung:
[ProtoContract]
public struct DynamicTypeSurrogate<T>
{
[ProtoMember(1, DynamicType = true)]
public T Value { get; set; }
}
public static class DynamicTypeSurrogateExtensions
{
public static List<DynamicTypeSurrogate<T>> ToSurrogateList<T>(this IList<T> list)
{
if (list == null)
return null;
return list.Select(i => new DynamicTypeSurrogate<T> { Value = i }).ToList();
}
public static List<T> FromSurrogateList<T>(this IList<DynamicTypeSurrogate<T>> list)
{
if (list == null)
return null;
return list.Select(i => i.Value).ToList();
}
}
Und dann RedisDataObject
Modifizieren eines Surrogat-Wörterbuch zur Serialisierung wie folgt:
[ProtoContract]
public class RedisDataObject
{
[ProtoMember(1)]
public string DataHash;
[ProtoIgnore]
public Dictionary<ContextActions, List<Tuple<string, List<object>>>> Value;
[ProtoMember(2)]
private Dictionary<ContextActions, List<Tuple<string, List<DynamicTypeSurrogate<object>>>>> SurrogateValue
{
get
{
if (Value == null)
return null;
var dictionary = Value.ToDictionary(
p => p.Key,
p => (p.Value == null ? null : p.Value.Select(i => Tuple.Create(i.Item1, i.Item2.ToSurrogateList())).ToList()));
return dictionary;
}
set
{
if (value == null)
Value = null;
else
{
Value = value.ToDictionary(
p => p.Key,
p => (p.Value == null ? null : p.Value.Select(i => Tuple.Create(i.Item1, i.Item2.FromSurrogateList())).ToList()));
}
}
}
}
Beachten Sie auch die Beschränkungen für DynamicType
here erwähnt:
DynamicType
- speichert zusätzliche Type
Informationen mit dem Typ (standardmäßig enthält es die AssemblyQualifiedName
, obwohl dies vom Benutzer kontrolliert werden kann). Dies macht es möglich, schwache Modelle zu serialisieren, dh wo object
für Eigenschaft Mitglieder verwendet wird, aber derzeit ist dies auf Vertrag Typen (nicht Primitiven) beschränkt, und funktioniert nicht für Typen mit Vererbung (diese Einschränkungen können zu einem späteren Zeitpunkt entfernt werden Zeit). Wie bei AsReference
verwendet diese ein ganz anderes Layout-Format
Während die obige Dokumentation auf der former project site existiert und wurde auf die current site nicht bewegt, die Beschränkung auf Nicht-Vertragsarten besteht definitiv noch ab Version 2.0.0.668 . (I getestet, dass das Hinzufügen eines int
Wert auf den List<object>
versagt;. Ich habe nicht geprüft, ob die Beschränkung auf Vererbung noch existiert)
ich ein 'InvalidOperationException' sagen _Dynamic Typ ist kein Vertrag Typ: _, Objektlisten verdoppelt, Dezimalzahlen, Daten und Zeichenketten enthalten. –
@ andrei.ciprian - das klingt wie das in [diese Frage] beschriebene Problem (https://stackoverflow.com/questions/17656133). – dbc
Ich mag Ihren Ansatz, aber es funktioniert nicht, für jeden Typ. Die Frage, die Sie vorgeschlagen haben, würde ich mir vorstellen (http://stackoverflow.com/a/38914841/2239678) –