DCSIMG
February 2009 - Posts - Ido Flatow's Blog Veni Vidi Scripsi

Ido Flatow's Blog

Veni Vidi Scripsi

News

Have you heard me speak?
Powered
<style type='text/css' media='screen' id='sm_css'> #smix {overflow: visible;height: auto;border-radius: 10px;max-width: 250px;background-color: #323232;text-align: left;font-size: 12px;line-height: 16px;font-family:'Lucida Sans Unicode','Lucida Grande',Verdana,Arial,Helvetica,sans-serif;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;} #smix a {color: #0056CC;text-decoration: none;} #smix .sm_head {color: #fff; line-height: 1em;font-size: 1.4em;padding: 10px;color: #fff;} #smix .sm_lanyard_wrapper {background-color: #fff;;clear: both;width: 97%;margin: 0 auto;margin-bottom: 0px;} #smix .sm_lanyard_content {padding: 7px;}#smix button.sm_rec, #smix a.sm_rec, #smix input[type=submit].sm_rec { padding: 6px 10px; -webkit-border-radius: 2px 2px;-moz-border-radius: 2px; border-radius: 2px; border: solid 1px rgb(153, 153, 153); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(255, 255, 255)), to(rgb(221, 221, 221))); color: #333; text-decoration: none; cursor: pointer; display: inline-block; text-align: center; text-shadow: 0px 1px 1px rgba(255,255,255,1); line-height: 1; }#smix .sm_rec:hover { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(248, 248, 248)), to(rgb(221, 221, 221))); }#smix .sm_rec:active { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(204, 204, 204)), to(rgb(221, 221, 221))); }#smix .sm_rec.medium { padding: 3px 7px; font-size: 13px; }#smix .sm_rec span.icon.thumbs_up {background-position: 0px 36px;vertical-align: text-top;display: inline-block;margin-right: 4px;height: 18px;width: 16px;background-image: url(http://speakermix.com/images/new/thumbsold.png);}#smix .sm_rec:hover span.icon.thumbs_up {background-position: 0px 18px;} #smix .sm_events {padding:2px 0px 4px 0px;} #smix .sm_section {font-size: 10px; border-bottom: 1px solid silver; margin-bottom: 6px;} #smix .sm_subline {font-size:120%;margin-top:4px;font-weight:bold} #smix .powered {text-align: right} #smix .powered img {margin: 7px} </style>
Sela Technology Center

Advertisement

February 2009 - Posts

DataContractSerializer’s ServiceKnownType & KnownType attributes

When we use WCF in conjunction with DataContractSerializer one notices that there are 2 attributes you can use: ServiceKnownTypeAttribute and KnownTypeAttribute

KnownTypeAttribute:

Let’s say you have the following classes:

1. Person

2. Employee – derives from Person

If you mark each class with the DataContract attribute and create a service operation that returns a Person type, you will be able to return a Person, but not an Employee. If you try to return the latter, you’ll receive either a serialization error (if you catch it on the server side) or a strange client-side error.

To fix this problem you decorate your base class (Person) with the KnownType attribute to tell the outside world (meaning the service contract and the serializer) what a Person can look like, such as:

[KnownType(typeof(Employee))]
[DataContract]
public class Person {…}

Once you decorate your Person class with every known derived type, you can return these types from your service (or receive these types). Be sure to update your client’s service reference to get these new definitions.

To conclude – Use KnownType because if you don’t tell the outside world what to expect, don’t be surprised if they don’t understand that you meant to send the base but sent the derived instead…

For more information: KnownTypeAttribute Class

ServiceKnownType:

The above case was useful when your service used the base class as the input/output type of the operation, but what if your operation returns an arbitrary “object”? or just a simple hashtable?

In this case you can’t use KnownType because this attribute applies to data classes, not to methods or services.

If your operation receives/returns an arbitrary type, use the ServiceKnownType attribute to decorate either the service or one of it’s operations and state which types the service can receive/return (or in other words – which data contracts the service is aware of).

For more information: ServiceKnownTypeAttribute Class