Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# How to serialize (JSON, XML) normal properties on a class that inherits from DynamicObject

I am trying to serialize an instance of a class that inherits from DynamicObject. I've had no trouble getting the dynamic properties to serialize (not demonstrated here for brevity), but "normal" properties don't seem to make the trip. I experience the same problem regardless of serialization class: it's the same for JavaScriptSerializer, JsonConvert, and XmlSerializer.

public class MyDynamicClass : DynamicObject
{
    public string MyNormalProperty { get; set; }
}

...

MyDynamicClass instance = new MyDynamicClass()
{
    MyNormalProperty = "Hello, world!"
};

string json = JsonConvert.SerializeObject(instance);
// the resulting string is "{}", but I expected to see MyNormalProperty in there

Shouldn't MyNormalProperty show up in the serialized string? Is there a trick, or have I misunderstood something fundamental about inheriting from DynamicObject?

like image 744
DJ Grossman Avatar asked Sep 16 '13 07:09

DJ Grossman


People also ask

What is C in simple words?

C Introduction C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.

Is C or C++ same?

While C and C++ may sound similar, their features and usage differ. C is a procedural programming language that support objects and classes. On the other hand C++ is an enhanced version of C programming with object-oriented programming support.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.


2 Answers

You can use the DataContract/DataMember attributes from System.Runtime.Serialization

    [DataContract]
    public class MyDynamicClass : DynamicObject
    {
        [DataMember]
        public string MyNormalProperty { get; set; }
    }

This way the serialisation will work no matter what serialiser you use...

like image 112
Stephen Byrne Avatar answered Oct 20 '22 22:10

Stephen Byrne


Just use JsonProperty attribute

public class MyDynamicClass : DynamicObject
{
    [JsonProperty("MyNormalProperty")]
    public string MyNormalProperty { get; set; }
}

Output: {"MyNormalProperty":"Hello, world!"}

like image 42
I4V Avatar answered Oct 20 '22 23:10

I4V