Autor Beitrag
braincom654
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Fr 07.03.14 16:07 
Hi,
ich möchte gerne ein Interface de- sowie serializen.

So sehen meine 2 methoden aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
public string ConvertEntityContainerToString(List<IEntityType> input)
    {
      if (input == null || input.Count <= 0return null;
      try
      {
        return JsonConvert.SerializeObject(input);
      }
      catch (Exception)
      {
        return null;
      }
    }
    public List<IEntityType> ConvertStringToEntityContainer(string input)
    {
      if (string.IsNullOrEmpty(input)) return null;
      try
      {
        return JsonConvert.DeserializeObject<List<IEntityType>>(input);
      }
      catch (Exception)
      {
        return null;
      }
    }

Doch dann kommt folgender Fehler:
Newtonsoft.Json.JsonSerializationException was caught
HResult=-2146233088
Message=Could not create an instance of type x.IEntityType. Type is an interface or abstract class and cannot be instantiated. Path '[0].Service'

So sieht das Interface aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
public interface IEntityType
  {
    string Service { get; set; }
    string Name { get; set; }
    List<IProperty> PropertyRefs { get; set; }
    List<IProperty> Properties { get; set; }
    List<INavigationProperty> NavProperties { get; set; }

    List<string> GetPropNames();
    List<string> GetPropRefNames();
    List<IProperty> GetAllProperties();
    List<string> GetAllPropertiesNames();
    string GetTypeByName(string keyName);
    INavigationProperty GetNavigationPropertyByName(string name);
    INavigationProperty GetNavigationPropertyByAssociationName(string toEntity);
    List<IProperty> GetAllMandatoryProperties();
    string ToString();
    List<IProperty> Definition();
    Hashtable GetPropRefWithValue(Hashtable properties);
    bool RemovePropByName(string name);
  }


Habe folgende Lösungen schon versucht: stackoverflow.com/qu...serialize-properties
Doch scheint einfach nicht zu funktionieren. Wäre sehr nett wenn jemand mir weiterhelfen könnte

EDIT:

Es muss nicht von der Newtonsoft Libary kommen, wenn .Net es schon anbietet ein anderen Serialzer in diesen Falle einwandfrei funktioniert bin ich auch zufrieden (xml auch möglich).


Zuletzt bearbeitet von braincom654 am Fr 07.03.14 16:54, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 07.03.14 16:41 
Ich halte das für eine ganze schlechte Idee zu versuchen Interfaces zu serialisieren.

Die Dynamik da beliebige Implementoren für die Interfaces nachzureichen wird nicht funktionieren. Der Serialisierer/Deserialisierer muß nach einem eindeutigen Kriterium entscheiden können welche konkrete Klasse tatsächlich (insbesondere beim deserialisieren) zu verwenden ist. Das läuft darauf hinaus das du a entweder dem Seralisierer ein Mapping für jedes Interface mitgeben mußt (ala für IProperty nehme stattdessen immer Property) oder du wirst deine Properties die Interfaces veröffentlichen mit Attributen versehen müßen an denen steht welcher konkrete Typ tatsächlich veröffentlicht wird. Dann kann man aber auch gleich den konkreten Typ veröffentlichen anstatt ein Interface.

Solange mir keiner das Gegenteil beweißt behaupte ich das das nicht klappen kann. Ein dynamischen Typ serialisieren/deserialisieren in ein Format das keinerlei Typinformationen enthält geht nicht wirklich.
braincom654 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 32



BeitragVerfasst: Fr 07.03.14 16:53 
Hm.. Okay.
Wie würdest du folgenden Fall dann lösen:
Ich habe diese List<IEntityType> und muss das zwischencachen. Mache ich mit searilation in eine Datei, danach wieder deserialzion. Doch ich brauche als Rückgabewert eine List<IEntityType>, wie wäre dies Lösbar?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 07.03.14 17:31 
Für deinen Cache gibt es vermutlich keinen Anspruch auf Lesbarkeit bzw. Transportabilität. Dann würd ich das binär machen. Z.B. mit dem BinaryFormatter. Da der Typinformationen serialisiert sollte das klappen (hab ich aber nicht probiert).

Für diesen Beitrag haben gedankt: braincom654