Информация об изменениях

Сообщение Re[3]: Динамическое приведение типов от 17.08.2015 11:32

Изменено 17.08.2015 11:36 Serginio1

Здравствуйте, mitechka, Вы писали:

M>Да я смотрел в сторону NetDataContractSerializer'а, но, к сожалению, на другой стороне же необходимо приводить базовый класс к производному, тип которого заранее неизвестен, а сериалайзер не умеет конструировать объекты произвольного типа.


Для интереса сделал иерархию
namespace test
{
     [DataContract]
    public abstract class Base
    {

        [DataMember]

        public string BaseName { get; set; }

    }




    [DataContract]

    public class MyClass1 : Base
    {

        [DataMember]

        public string Поле1 { get; set; }
      

    }




И соответственно сериализация десериализация

 var child = new test.MyClass1();
            child.Поле1 = "MyClass1";
            // here is where I went wrong before -- I used typeof(Child), with no known types to serialize
            var serializer = new DataContractSerializer(typeof(object), new Type[] { typeof(test.MyClass1) });
            var stream = new MemoryStream();
            serializer.WriteObject(stream, child);
            stream.Position = 0;
            TextReader tr = new StreamReader(stream);
            var str = tr.ReadToEnd();
            stream.Position = 0;
            serializer = new DataContractSerializer(typeof(object), new Type[] { typeof(test.MyClass1) });
            object test = serializer.ReadObject(stream);
            stream.Dispose();


str имеет значение

<z:anyType i:type="a:MyClass1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/test"><a:BaseName i:nil="true"/><a:Поле1>MyClass1</a:Поле1></z:anyType>



а test имеет тип MyClass1 и Поле1 = "MyClass1";
Здравствуйте, mitechka, Вы писали:

M>Да я смотрел в сторону NetDataContractSerializer'а, но, к сожалению, на другой стороне же необходимо приводить базовый класс к производному, тип которого заранее неизвестен, а сериалайзер не умеет конструировать объекты произвольного типа.


Для интереса сделал иерархию
namespace test
{
     [DataContract]
    public abstract class Base
    {

        [DataMember]

        public string BaseName { get; set; }

    }




    [DataContract]

    public class MyClass1 : Base
    {

        [DataMember]

        public string Поле1 { get; set; }
      

    }




И соответственно сериализация десериализация

 var child = new test.MyClass1();
            child.Поле1 = "MyClass1";
            // here is where I went wrong before -- I used typeof(Child), with no known types to serialize
            var serializer = new DataContractSerializer(typeof(object), new Type[] { typeof(test.MyClass1) });
            var stream = new MemoryStream();
            serializer.WriteObject(stream, child);
            stream.Position = 0;
            TextReader tr = new StreamReader(stream);
            var str = tr.ReadToEnd();
            stream.Position = 0;
            serializer = new DataContractSerializer(typeof(object), new Type[] { typeof(test.MyClass1) });
            object test = serializer.ReadObject(stream);
            stream.Dispose();


str имеет значение

<z:anyType i:type="a:MyClass1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:a="http://schemas.datacontract.org/2004/07/test">
<a:BaseName i:nil="true"/><a:Поле1>MyClass1</a:Поле1>
</z:anyType>



а test имеет тип MyClass1 и Поле1 = "MyClass1";