2012-11-07 18 views
12

Mam klasę oznaczoną [Serializable]. Kiedy zwrócę go z Web API, wszystkie nazwy pól są funky.ASP.NET Web API i [Serializable] klasa

Zwykle JSON zwrócony jest

[{"OrderId":797 ... 

JSON zwrócona przy użyciu [Serializable]

[{"<OrderId>k__BackingField":797 ... 

I wa, aby zaznaczyć, że serializacji użyć BinaryFormatter buforowania. Czy jest jakiś inny sposób niż napisanie niestandardowego serializera lub stworzenie bliźniaczej klasy, która nie jest możliwa do serializacji i napisanie małpiego kodu do "rzucania" pomiędzy tymi dwoma?

+0

w jaki sposób formatator binarny pomaga w buforowaniu? – DarthVader

+0

Zamówienia są realizowane z zewnętrznego systemu, a uzyskanie wszystkich zamówień od zera na dzień za pośrednictwem interfejsu API zajmuje 10 sekund. Znacznie szybciej można uzyskać zamówienia między ostatnio zapisaną datą w pamięci podręcznej i bieżącą datą, zapisać je w pamięci podręcznej, a następnie zwrócić pełną listę. – Malako

+1

To jest ograniczenie z JSON.net [domyślna biblioteka serializacji JSON używana w Web API]. Zobacz: http://stackoverflow.com/questions/10143420/why-does-json-net-serialization-fail-with-serializable-and-a-ambambda-inside-a-r. Możesz spróbować użyć najnowszej wersji JSON.NET lub znaleźć inny sposób buforowania rzeczy. – Suhas

Odpowiedz

21

Trzeba tylko tę jedną wkładkę dostać Json.NET ignorować [Serializable] semantykę ponownie:

((DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true; 

Lepszym rozwiązaniem dla Ciebie może być pozbyć [Serializable] całkowicie zaprzestać używania BinaryFormatter i zamiast tego użyj innego serializera, aby wykonać cache, które chcesz zrobić, na przykład serializator Json.NET.

+0

Dzięki! Działa dobrze dla JsonFormatter, ale czy istnieje bardziej ogólny sposób? Mam klientów żądających Json, JsonP i Xml. – Malako

+1

Nie, nie ma. Każdy formatator ma swobodę wyboru sposobu obsługi [Serializable] na swój własny sposób. Domyślny XmlFormatter rozpoznaje [Serializable], ale możesz go przełączyć na XmlSerializer, aby tego uniknąć. Lepszym rozwiązaniem dla Ciebie może być całkowite pozbycie się [Serializable], przestań używać BinaryFormatter i zamiast tego użyj innego serializera, aby zrobić cache, co chcesz zrobić, na przykład serializator Json.NET na przykład. –

+1

Skonsultowałem się z serializatorem Json.NET zgodnie z sugestiami. Wydajność jest tak dobra, jak BinaryFormatter i nie ma potrzeby używania atrybutu [Serializable]. Połóż to w odpowiedzi, a dostaniesz swoją wiarygodność. Dzięki! – Malako