DataContractJsonSerializer EmitTypeInformation is never ignored on Windows Phone 8.1

Windows Universal App 8.1. The DataContractJsonSerializer always emits type information for derived classes for Windows Phone App 8.1. It works correctly for Windows Store App 8.1.

Test code and result below. Any ideas for a workaround besides editing the json post serialization?

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;

namespace TestEmitTypeInformation
{
    [DataContract]
    public class DataContractBase
    {
        [DataMember]
        public string BaseString { get; set; }
    }

    [DataContract]
    public class DataContractDerived : DataContractBase
    {
        [DataMember]
        public string DerivedString { get; set; }
    }

    public class DataContractTest
    {

        public static void SerializeTestAll()
        {
            var test = new DataContractTest();
            test.SerializeTest(System.Runtime.Serialization.EmitTypeInformation.Always);
            test.SerializeTest(System.Runtime.Serialization.EmitTypeInformation.AsNeeded);
            test.SerializeTest(System.Runtime.Serialization.EmitTypeInformation.Never);
        }

        public void SerializeTest(EmitTypeInformation emitTypeInfo)
        {
            var testObject = new DataContractDerived() {  BaseString="Base", DerivedString="Derived" };

            using (MemoryStream memStream = new MemoryStream())
            {
                var serializationSettings =
                    new DataContractJsonSerializerSettings()
                    {
                        EmitTypeInformation = emitTypeInfo,
                        KnownTypes = new Type[] { typeof(DataContractDerived) }
                    };
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(DataContractBase), serializationSettings);
                ser.WriteObject(memStream, testObject);

                memStream.Position = 0;
                string jsonContent = new StreamReader(memStream).ReadToEnd();

                Debug.WriteLine("Result: EmitTypeInformation {0}\n{1}", emitTypeInfo, jsonContent);
            }
        }
    }
}

      

Results of calling DataContractTest.SerializeTestAll (): - Windows 8.1

Result: EmitTypeInformation Always
{"__type":"DataContractDerived:#TestEmitTypeInformation","BaseString":"Base","DerivedString":"Derived"}
Result: EmitTypeInformation AsNeeded
{"__type":"DataContractDerived:#TestEmitTypeInformation","BaseString":"Base","DerivedString":"Derived"}
Result: EmitTypeInformation Never
{"BaseString":"Base","DerivedString":"Derived"}

      

Windows Phone 8.1

Result: EmitTypeInformation Always
{"__type":"DataContractDerived:#TestEmitTypeInformation","BaseString":"Base","DerivedString":"Derived"}
Result: EmitTypeInformation AsNeeded
{"__type":"DataContractDerived:#TestEmitTypeInformation","BaseString":"Base","DerivedString":"Derived"}
Result: EmitTypeInformation Never
{"__type":"DataContractDerived:#TestEmitTypeInformation","BaseString":"Base","DerivedString":"Derived"}

      

+3


source to share


1 answer


You can try this: How can I exclude the Type information from the DataContract?



I also faced a similar problem, but we are not using the newer version so I cannot use it.

0


source







All Articles