Reputation: 2590
I'm trying to compare performance results of serialization / deserialization using Newtonsoft.Json and ServiceStack.Text libraries. I have a large class which is named Application and I'm using an instance of this class for these operations. For the same instance NewtonSoft.Json works fine and gives me the following output:
{
"$id": "1",
"_expiryDate": {
"$id": "2",
"_underlyingValue": null,
"_isModified": false,
"_isTrimmed": false
},
"_number": {
"$id": "3",
"_underlyingValue": 700771,
"_isModified": true,
"_isTrimmed": false
},
"_sobfDate": {
"$id": "4",
"_underlyingValue": null,
"_isModified": false,
"_isTrimmed": false
},
"_applyDate": {
"$id": "5",
"_underlyingValue": "/Date(1355127719000+0200)/",
"_isModified": true,
"_isTrimmed": false
},
"_approvalDate": {
"$id": "6",
"_underlyingValue": null,
"_isModified": false,
"_isTrimmed": false
},
"_contractDate": {
"$id": "7",
"_underlyingValue": null,
"_isModified": false,
"_isTrimmed": false
},
"_associatedLimitOffers": {
"$id": "8",
"$values": []
},
"_decisionTreeApprovals": {
"$id": "9",
"$values": [
{
"$id": "10",
"_entity": {
"$id": "11",
"_date": null,
"_rules": null,
"_result": {
"$id": "12",
"_underlyingValue": 30,
"_isModified": true,
"_isTrimmed": false
},
"_applicant": null,
"_activity": null,
"_type": null,
"_application": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
}
]
},
"_courierTasks": {
"$id": "13",
"$values": []
},
"_guarantors": {
"$id": "14",
"$values": []
},
"_utilization": {
"$id": "15",
"_entity": {
"$id": "16",
"_date": {
"$id": "17",
"_underlyingValue": null,
"_isModified": true,
"_isTrimmed": false
},
"_isBlockedUsage": null,
"_application": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_associatedBalanceSheet": {
"$id": "18",
"$values": []
},
"_collaterals": {
"$id": "19",
"$values": []
},
"_submitterChannel": {
"$id": "20",
"_entity": {
"$id": "21",
"$type": "BigBank.Data.Model.ChannelDomain.VirtualChannel, BigBank.Data.Model",
"_hierarchyDelegates": null,
"_displayName": {
"$id": "22",
"_underlyingValue": "",
"_isModified": true,
"_isTrimmed": false
},
"_key": null,
"_isActive": null,
"_integrationCode": null,
"_limitOptions": null,
"_contractedOrganizations": null,
"_constraints": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_ownerChannel": {
"$id": "23",
"_entity": {
"$id": "24",
"$type": "BigBank.Data.Model.ChannelDomain.VirtualChannel, BigBank.Data.Model",
"_hierarchyDelegates": null,
"_displayName": {
"$id": "25",
"_underlyingValue": "",
"_isModified": true,
"_isTrimmed": false
},
"_key": null,
"_isActive": null,
"_integrationCode": null,
"_limitOptions": null,
"_contractedOrganizations": null,
"_constraints": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_scoreCard": {
"$id": "26",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_seller": {
"$id": "27",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_priority": {
"$id": "28",
"_underlyingValue": null,
"_isModified": false,
"_isTrimmed": false
},
"_merchandise": {
"$id": "29",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_payment": {
"$id": "30",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_requestedTerm": {
"$id": "31",
"_entity": {
"$id": "32",
"_maturity": null,
"_application": null,
"_items": null,
"_product": {
"$id": "33",
"_entity": {
"$id": "34",
"_key": null,
"_isActive": null,
"_description": {
"$id": "35",
"_underlyingValue": "",
"_isModified": true,
"_isTrimmed": false
},
"_beginDate": null,
"_endDate": null,
"_limitOptions": null,
"_baseProduct": null,
"_derivedProducts": null,
"_attributes": null,
"_hierarchyDelegates": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_accumulatedInterestUsage": null,
"_pricingFactor": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_status": {
"$id": "36",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_applicant": {
"$id": "37",
"_entity": {
"$id": "38",
"$type": "BigBank.Data.Model.PersonDomain.Person, BigBank.Data.Model",
"_birthDate": null,
"_birthPlace": null,
"_citizenshipNumber": {
"$id": "39",
"_underlyingValue": 11111111111,
"_isModified": true,
"_isTrimmed": false
},
"_dependentRelative": null,
"_disabilityRate": null,
"_religion": null,
"_totalWorkingPeriodInMonth": null,
"_isStaff": null,
"_identificationCertificate": null,
"_drivingLicense": null,
"_passport": null,
"_relatives": null,
"_relativeOf": null,
"_socialSecurities": null,
"_workExperiences": null,
"_decisionTreeApprovals": {
"$id": "40",
"$values": []
},
"_bloodGroup": null,
"_gender": null,
"_graduation": null,
"_maritalStatus": null,
"_name": {
"$id": "41",
"_first": {
"$id": "42",
"_underlyingValue": "TEST",
"_isModified": true,
"_isTrimmed": false
},
"_last": {
"$id": "43",
"_underlyingValue": "TEST",
"_isModified": true,
"_isTrimmed": false
},
"_maiden": null
},
"_nationality": null,
"_deathNotice": null,
"_workingStatus": null,
"_profession": null,
"_birthProvince": null,
"_balanceSheet": {
"$id": "44",
"$values": []
},
"_predefinedLimitOffers": null,
"_accounts": null,
"_locations": null,
"_partnerships": null,
"_applications": null,
"_guarantoredRetailLoanApplications": null,
"_customer": null,
"_tax": null,
"_baseLimit": null,
"_associatedDocuments": null,
"_phones": null,
"_emails": null,
"_isInsured": null,
"_insurances": null,
"_comments": null,
"_createdAt": null,
"_id": {
"$id": "45",
"_underlyingValue": "7c1058a6-0dd3-c378-ebaa-fdcf2a8a6936",
"_isModified": true,
"_isTrimmed": false
},
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"CreditReferenceResult": {
"$id": "46",
"_creditReferencesApplication": null,
"_scrCreditLimit": null,
"_creditReferences": null,
"_creditReferenceOwnData": null,
"_person": null
},
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_purpose": {
"$id": "47",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_targetAccount": {
"$id": "48",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_contractLocation": {
"$id": "49",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_contractPhone": {
"$id": "50",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_contractEmail": {
"$id": "51",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_contactLocation": {
"$id": "52",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_contactPhone": {
"$id": "53",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_contactEmail": {
"$id": "54",
"_entity": null,
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_fundsTransferType": {
"$id": "55",
"_underlyingValue": null,
"_isModified": false,
"_isTrimmed": false
},
"_associatedDocuments": {
"$id": "56",
"$values": []
},
"_comments": {
"$id": "57",
"$values": []
},
"_createdAt": null,
"_id": {
"$id": "58",
"_underlyingValue": "b9ee4131-43c6-6fe0-be4d-bbe60e6ace97",
"_isModified": true,
"_isTrimmed": false
},
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": {
"$id": "59",
"_entity": {
"$id": "60",
"_state": {
"$id": "61",
"_underlyingValue": "Rejected(Completed)",
"_isModified": true,
"_isTrimmed": false
},
"_description": {
"$id": "62",
"_underlyingValue": "Red(Tamamlandı)",
"_isModified": true,
"_isTrimmed": false
},
"_isCompleted": null,
"_correlationKey": null,
"_logs": null,
"_migration": null,
"_parent": null,
"_children": null,
"_variables": null,
"_definition": null,
"_createdAt": null,
"_id": null,
"_isDeleted": null,
"_isModifiedByOwnProcess": null,
"_version": null,
"_createdBehalfOf": null,
"_createdBy": null,
"_process": null,
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverEntityId": null,
"_serverEntityTypeName": null,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
},
"_clientState": 0,
"_serverState": 0,
"_isLoaded": false,
"_isTrimmed": false
}
behind this the output of ServiceStack.Text is just:
{"_serverState":"New","_isLoaded":false,"_isTrimmed":false}
Here is my methods doing serialization for both:
private List<string> SerializeUsingServiceStackText(List<Application> applications)
{
List<string> strings = new List<string>();
foreach (Application item in applications)
{
string s = ServiceStack.Text.JsonSerializer.SerializeToString<Application>(item);
strings.Add(s);
}
return strings;
}
Newtonsoft.Json.JsonSerializerSettings jsonSerializerSettings =
new Newtonsoft.Json.JsonSerializerSettings()
{
PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All,
DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat,
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
};
private List<string> SerializeUsingJsonNet(List<Application> applications)
{
List<string> strings = new List<string>();
foreach (Application item in applications)
{
strings.Add(Newtonsoft.Json.JsonConvert.SerializeObject(item, Newtonsoft.Json.Formatting.None, jsonSerializerSettings));
}
return strings;
}
What am I doing wrong? Do I have to do some settings for the ServiceStack.Text library as I do in Newtonsoft.Json?
Upvotes: 2
Views: 2722
Reputation: 18122
The serializable properties are retrieved with this method. It only gets public, readable properties. No private properties or fields. Looks like you either have to change your POCOs or you're stuck with Newtonsoft.Json :)
Maybe this GitHub issue answers your question?
EDIT: I guess you COULD do something like this:
var bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
TypeConfig<Application>.Properties = typeof(Application).GetProperties(bindingFlags);
You should probably also check for a getter and that the properties are not marked with IgnoreDataMemberAttribute
etc. But you're still stuck with properties...
I may be wrong, but I see no way of plugging this into the framework, so you have to do this for all the types you want to de-/serialize. Maybe you could make a generic extension method which does this and then de-/serializes the object?
Upvotes: 3
Reputation: 997
It looks like you are trying to serialize a class with private properties but ServiceStack serializes only public properties.
Upvotes: 2