I need to serialize a class which it's source code cannot be changed (take this as a fact), and it's from a different assembly. It has only one constructor
public class MyObject
{
    string _s;
    int _i;
    internal MyObject(string s, int i)
    {
        // ...
    }
}
JsonConvert.SerializeObject(object) fails of course because of this. I wonder if there is a way to use Json.NET to serialize this class without having to adding code or even tags to it. 
If you have a parameterless constructor, you should be able to do this by adding the following setting:
JsonSerializerSettings settings = new JsonSerializerSettings()
{
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};
var serializedJson = JsonConvert.DeserializeObject<MyObject>(jsonString, settings);
Update after question edit:
If you don't have any public constructors and you don't have a parameterless constructor, then I only know of 2 options:
[JsonConstructor] attribute to your internal constructor (which doesn't seem an option in your case as you cannot edit the class).You should use a custom JsonConverter.
The solution would be something like
public class MyObjectProxy
{
    public string s { get; set; }
    public int i { get; set; }
}
public class MyObjectJsonConverter : JsonConverter
{
    public override void WriteJson(
        JsonWriter writer, object value, JsonSerializer serializer)
    {
        // Create an instance of MyObjectProxy, copy values from the
        // instance of MyObject, write JSON from the MyObjectProxy.
    }
    public override object ReadJson(
        JsonReader reader, Type type, object value, JsonSerializer serializer)
    {
        // Deserialize MyObjectProxy, create an instance of MyObject,
        // copy properties from the deserialized MyObjectProxy.
    }
    public override bool CanConvert(Type type)
    {
        return typeof(MyObject).IsAssignableFrom(type);
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With