Arreglos de netos de ProtoBUF de tipos complejos con herencia -- protobuf-net camp Relacionados El problema

protobuf-net arrays of complex types with inheritance


1
vote

problema

Español

Tengo una jerarquía, digamos Baseclass & LT; - DerivedClass Quiero serializar una matriz BAELSLASS [] con objetos mezclados de derivedclass y baseclass
Yo uso v2 SourceCode Revisión R438 (9 de agosto de 2011)

pseudocode: MyArray = NUEVO BAELSLASS [] {NUEVO BAELSLASS (), Nueva DerivedClass ()};

Probé varias declaraciones, pero no obtengo el resultado deseado:

  [ProtoMember(1, AsReference = true, DynamicType = true)] private BaseClass[] myArray;   

- & gt; No deserializar todas las referencias no se establecen

  [ProtoMember(1, AsReference = true, DynamicType = true)] private object[] myArray;   

- & gt; Deserrazze, pero el tipo de matriz cambió de BAELSLASS [] al objeto []

¿Algún suggetions cómo puedo obtener mi matriz original de BAELSLASS []?

[editar] Pruebas de unidad:

  namespace TechnologyEvaluation.Protobuf.ArrayOfBaseClassTest {     using System;     using NUnit.Framework;     using ProtoBuf;     using ProtoBuf.Meta;      [ProtoContract]     class BaseClassArrayContainerClass     {         [ProtoMember(1, DynamicType = true)]         public Base[] BaseArray { get; set; }     }      [ProtoContract]     class ObjectArrayContainerClass     {         [ProtoMember(1, DynamicType = true)]         public object[] ObjectArray { get; set; }      }     [ProtoContract]     class Base     {         [ProtoMember(1)]         public string BaseClassText { get; set; }     }      [ProtoContract]     class Derived: Base     {         [ProtoMember(1)]         public string DerivedClassText { get; set; }     }      [TestFixture]     class ArrayOfBaseClassTests : AssertionHelper     {         [Test]         public void TestObjectArrayContainerClass()         {             var model = CreateModel();             var container = new ObjectArrayContainerClass();             container.ObjectArray = this.CreateArray();             var cloned = (ObjectArrayContainerClass) model.DeepClone(container);             Expect(cloned.ObjectArray, Is.Not.Null);              foreach (var obj in cloned.ObjectArray )             {                 Expect(obj as Base, Is.Not.Null);             }              Expect(cloned.ObjectArray[1] as Derived, Is.Not.Null);             Expect(cloned.ObjectArray.GetType(), Is.EqualTo(typeof(Base[])));          }          [Test]         public void TestBaseClassArrayContainerClass()         {             var model = CreateModel();             var container = new BaseClassArrayContainerClass();             container.BaseArray = this.CreateArray();             var cloned = (BaseClassArrayContainerClass) model.DeepClone(container);             Expect(cloned.BaseArray, Is.Not.Null);              foreach (var obj in cloned.BaseArray)             {                 Expect(obj as Base, Is.Not.Null);             }             Expect(cloned.BaseArray[1] as Derived, Is.Not.Null);             Expect(cloned.BaseArray.GetType(), Is.EqualTo(typeof(Base[])));         }          RuntimeTypeModel CreateModel()         {             RuntimeTypeModel model = RuntimeTypeModel.Create();              model.Add(typeof(ObjectArrayContainerClass), true);             model.Add(typeof(BaseClassArrayContainerClass), true);             model.Add(typeof(Base), true);             model[typeof(Base)].AddSubType(100, typeof(Derived));              return model;         }          Base[] CreateArray()         {             return new Base[] { new Base() { BaseClassText = "BaseClassText" }, new Derived() { BaseClassText = "BaseClassText", DerivedClassText = "DerivedClassText" } };         }     } }   
Original en ingles

I have an hierarchy, lets say BaseClass <- DerivedClass I want to serialize a BaseClass[] array with mixed DerivedClass and BaseClass objects
I use V2 Sourcecode Revision r438 (Aug 9, 2011)

Pseudocode: myArray = new BaseClass[] {new BaseClass(), new DerivedClass()};

I tried several declarations, but i don't get the desired result:

[ProtoMember(1, AsReference = true, DynamicType = true)] private BaseClass[] myArray; 

-> Wont deserialize all references are not set

[ProtoMember(1, AsReference = true, DynamicType = true)] private object[] myArray; 

-> deserailze, but array type changed from BaseClass[] to object[]

Any suggetions how i can get my original BaseClass[] array back?

[Edit] Unit Tests:

namespace TechnologyEvaluation.Protobuf.ArrayOfBaseClassTest {     using System;     using NUnit.Framework;     using ProtoBuf;     using ProtoBuf.Meta;      [ProtoContract]     class BaseClassArrayContainerClass     {         [ProtoMember(1, DynamicType = true)]         public Base[] BaseArray { get; set; }     }      [ProtoContract]     class ObjectArrayContainerClass     {         [ProtoMember(1, DynamicType = true)]         public object[] ObjectArray { get; set; }      }     [ProtoContract]     class Base     {         [ProtoMember(1)]         public string BaseClassText { get; set; }     }      [ProtoContract]     class Derived: Base     {         [ProtoMember(1)]         public string DerivedClassText { get; set; }     }      [TestFixture]     class ArrayOfBaseClassTests : AssertionHelper     {         [Test]         public void TestObjectArrayContainerClass()         {             var model = CreateModel();             var container = new ObjectArrayContainerClass();             container.ObjectArray = this.CreateArray();             var cloned = (ObjectArrayContainerClass) model.DeepClone(container);             Expect(cloned.ObjectArray, Is.Not.Null);              foreach (var obj in cloned.ObjectArray )             {                 Expect(obj as Base, Is.Not.Null);             }              Expect(cloned.ObjectArray[1] as Derived, Is.Not.Null);             Expect(cloned.ObjectArray.GetType(), Is.EqualTo(typeof(Base[])));          }          [Test]         public void TestBaseClassArrayContainerClass()         {             var model = CreateModel();             var container = new BaseClassArrayContainerClass();             container.BaseArray = this.CreateArray();             var cloned = (BaseClassArrayContainerClass) model.DeepClone(container);             Expect(cloned.BaseArray, Is.Not.Null);              foreach (var obj in cloned.BaseArray)             {                 Expect(obj as Base, Is.Not.Null);             }             Expect(cloned.BaseArray[1] as Derived, Is.Not.Null);             Expect(cloned.BaseArray.GetType(), Is.EqualTo(typeof(Base[])));         }          RuntimeTypeModel CreateModel()         {             RuntimeTypeModel model = RuntimeTypeModel.Create();              model.Add(typeof(ObjectArrayContainerClass), true);             model.Add(typeof(BaseClassArrayContainerClass), true);             model.Add(typeof(Base), true);             model[typeof(Base)].AddSubType(100, typeof(Derived));              return model;         }          Base[] CreateArray()         {             return new Base[] { new Base() { BaseClassText = "BaseClassText" }, new Derived() { BaseClassText = "BaseClassText", DerivedClassText = "DerivedClassText" } };         }     } } 
  
       
       

Lista de respuestas


Relacionados problema

2  ¿El objeto tiene atributo?  ( Does object have attribute ) 
Dada la clase: [ProtoContract] [Serializable] public class TestClass { [ProtoMember(1)] public string SomeValue { get; set; } } y el método: ...

1  ¿Cómo se distingue el compilador de protobuff entre los diferentes servicios y sus mensajes con los mismos identificadores / etiquetas?  ( How does the protobuff compiler distinguish between different services and their ) 
La pregunta es respecto al proceso de deserialización. Pensé que los primeros bytes describen la etiqueta y la correspondiente en el servicio de cabello. Pero...

1  ¿Cómo saber mejor si un parámetro de tipo genérico puede ser serializado por ProtoBuf-net?  ( How to best tell if a generic type parameter can be serialized by protobuf net ) 
Estoy escribiendo algunas estructuras de datos genéricos personalizados. ¿Cómo puedo asegurarme de que el tipo genérico pase puede ser serializado por ProtoBu...

4  ¿Cómo guardar una lista <punto> usando ProtoBuf.net sin usar el texto ASCII?  ( How to save a listpoint using protobuf net without using ascii text ) 
Estoy intentando guardar datos de puntos en una lista a un archivo binario creado ProtoBUF.net. Si bien no tengo problemas con esto en sí mismo, también estoy...

1  Obtener "Tipo o espacio de nombres serializable no existe en el espacio de nombres ..." Error en la aplicación WP8  ( Getting type or namespace serializable does not exist in the namespace erro ) 
Así que soy bastante nuevo en esta cosa de ProtoBuf-Net, así como el desarrollo de WP8 y estoy teniendo un problema con el archivo .cs generado por protógeno ...

9  Usando ProtoBuf-Net, ¿cómo (DE) serializan una matriz multidimensional?  ( Using protobuf net how to deserialize a multi dimensional array ) 
Dado que ProtoBUF-NET no admite matrices multidimensionales de serialización / desergialización, ¿cómo iría a administrar mis matrices? ...

1  ¿Por qué el protocontractato no es válido en una estructura?  ( Why is protocontractattribute not valid on a struct ) 
¿Por qué no se puede aplicar ProtoContract a una estructura personalizada? Según esta pregunta y la respuesta asociada y el código , las estructuras obvia...

1  C ++ equivalente a serializewithlightprefix  ( C equivalent to serializewithlengthprefix ) 
Hice una biblioteca de comunicación utilizando búferes de protocolo (ProtoBuf-net) usando sockets (tcplistener y tcpclient) y está funcionando bien, pero ahor...

0  C # PROTOBUF-NET: ¿Cómo desialización consecutivamente de un flujo de red?  ( C sharp protobuf net how do i deserialize consecutively from a network stream ) 
Estoy (con gratitud) usando Biblioteca de tampones de protocos de Protobuf-Net Protocol de Marc Gravell . Desafortunadamente, estoy siendo uninteligente y te...

4  Plataforma ProtoBUF Independiente Protocolo de Socket - ¿Qué mensaje recibiré?  ( Platform independent protobuf socket protocol what message will i receive ) 
Me estoy preparando para escribir un protocolo de socket independiente de la plataforma. Después de alguna investigación inicial, Protobuf parece el camino a ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos