Ik heb in C# de volgende classes:
Een object van type "RequestReportAdd" wil ik serializeren als JSON op de volgende manier:
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?
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 ]