[C#] Serialization en "known types"

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Ik heb in C# de volgende classes:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[DataContract]
public class RequestReportAdd : Request
{
    // .. membertjes ..
    [DataMember(Name = "testFields")]
    public TestReport Report { get; set; }
}

[DataContract]
public abstract class TestReport
{
    // .. membertjes, geen datamembers
}

[DataContract]
public class TestReportTest : TestReport
{
    [DataMember(Name = "testField1")]
    public string Tf1 { get; set; }

    [DataMember(Name = "testField2")]
    public string Tf2 { get; set; }
}


Een object van type "RequestReportAdd" wil ik serializeren als JSON op de volgende manier:
C#:
1
2
3
4
5
6
protected Response _RequestSend(Request r)
{
    DataContractJsonSerializer jss = new DataContractJsonSerializer(r.GetType());
    MemoryStream requeststream = new MemoryStream();
    jss.WriteObject(requeststream, r);
}


Op de WriteObject krijg ik een SerializationException omdat "TestReportTest" niet bekend is bij de serializer. Waarom dat nodig is begrijp ik niet helemaal, want bij geen van de andere classes is dit nodig, maargoed, na wat gegoogle kom ik erop uit dat je het kan laten werken door ofwel bij de constructor van de DataContractJsonSerializer een statische lijst met known types mee te geven, of TestReport een KnownType(typeof(TestReportTest)) attribute te geven.

Echter was mijn bedoeling dat "TestReport" vanuit andere assemblies te overerven is zodat je zelf (projectafhankelijk) testrapporten met velden kan definieren, maar dan kan je uiteraard die types niet toevoegen aan de known types.
Een optie is om al die classes binnen deze assembly te houden en ze maar allemaal toe te voegen als known type, maar dat is niet helemaal wat ik dus zou willen, of met reflection te gaan rotzooien, maar dat maakt het allemaal onnodig complex lijkt me.

Weet iemand hoe ik het voor elkaar krijg om dit wel zoals ik wil (flexibel) te implementeren?

[ Voor 1% gewijzigd door Radiant op 16-07-2012 14:46 . Reden: project -> assembly ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Niemand weerhoud je ervan om die types ook de attribuut [KnownType] te geven?

En daarnaast, ik neem even aan dat deze andere assemblies uiteindelijk in hetzelfde appdomain geladen worden. In dat geval zou je met reflectie kunnen zoeken naar alle types welke erven van de klasse TestReport.
Waarbij je overigens hetzelfde doet als dat de serialiser achter de schermen met KnownTypes doet..

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Hmm je kan het inderdaad ook op de overervende klasse zelf specificeren 8)7 Dat was ik nog nergens tegengekomen.. Dan doen we dat maar :)

Snap alleen nog niet waarom het uberhaupt nodig is.. Omdat je anders misschien perongeluk klasses mee gaat serializen die geen specificatie van te serializen datamembers heeft? Dat doe je met DataContract toch al?

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Even het probleem vanuit een andere hoek bekijkend; is dit voor een fully-blown WCF service?

Zo niet, waarom zou je dan in hemelsnaam je eigen in allerlei bochten wringen met het gedrocht van een DataContractSerializer en alles wat er bij komt kijken als zelfs Microsoft de facto het hele boeltje overboord heeft gekiept en Newtonsoft's JSON.NET serializer als standaard gaat neerzetten voor ASP.NET 4.5 en ASP.NET Web API.

Is het wel voor een WCF service, moet het dat dan per sè zijn? Tenzij je client-side proxies wilt/moet hebben, zijn de configuratie en het opzetten van contracts meer complexiteit dan de moeite waard is en kun je een simpelere service ook gewoon via HTTP opzetten via een ASP.NET MVC Controller class (of met Web API; als ik me niet vergis zit deze inmiddels al onder een 'go live' license).
Goed technisch artikel als het inderdaad echt WCF moet zijn. Geeft alleen ook wel gelijk aan wat voor een ongelooflijk gehannes het is om met 'Unknown Types' te werken.