2016-04-26 11 views
1

Das Objekt [] mList enthält alle Objekte, die die untergeordnete Auflistung es wünscht. Dies sollte eine Dummy-Wrapper-Klasse für den Rest der mehr spezifizierten Sammlungen von Objekten sein.ProtoBuf-Net: Vererbung [ProtoMember] des Typs object [] von einer übergeordneten Klasse

[ProtoInclude(98, typeof(Object1CollectionProto))] 
[ProtoInclude(99, typeof(Object2CollectionProto))] 
[ProtoInclude(100, typeof(Object3CollectionProto))] 
public class ObjectCollectionProto 
{ 
    protected ObjectType mCollectionType; 
    protected object[] mList; 
    public ObjectCollectionProto(){} 

    [ProtoMember(1), DefaultValue(ObjectType.Base)] 
    public ObjectType CollectionType //enumeration for type 
    { 
    get { return mCollectionType; } 
    set { mCollectionType = value;} 
    } 

    [ProtoMember(2)] 
    public object[] List 
    { 
    get { return mList; } 
    set { mList = value;} 
    } 
} 

Dann haben wir ein Beispiel Kinderklasse der oben Dummy-Wrapper, der das Objekt [] davon Typ gewünscht ist erben soll.

[ProtoContract] 
public class Object1CollectionProto : ObjectCollectionProto 
{ 
    public Object1CollectionProto() 
    { 
    } 
} 

Wie gehe ich über die Klassenhierarchie spezifizieren, so dass Object1CollectionProto eine das Objekt [] MList als eine Liste von Object1 der erbt, die serialisiert werden kann? Objekt1's können in meinem Fall bereits serialisiert werden. Nur nicht die Sammlung Version von ihnen.

+1

'object []' wird einfach nicht funktionieren. Ich kann mir keine "guten" Wege vorstellen, das zu lösen, aber wenn ich Ihre Daten ansehe, bin ich verwirrt, warum Sie "ObjectCollectionProto" nicht durch "List " ersetzen können ... –

+0

Ich habe das gesehen ein weiterer Beitrag, also werde ich es so machen! Danke Marc! – jStaff

Antwort

0

How to serialize arrays? Dies ist ein guter Weg, um das Problem zu lösen, Remake nur den Rahmen auf diese Weise passen Arrays von Serialisierung.

Auch mit einigem sorgfältigen Denken habe ich einen Weg der Serialisierung Array richtig gemacht. In meinem Fall ich NIE tatsächlich serialisieren die PARENT Klasse, sondern ich nur die KINDER serialisieren.

Ich habe das ProtoMember-Attribut aus dem übergeordneten Klassenarray entfernt und das Array in den untergeordneten Elementen mit einem bestimmten Typ in die CHILDREN-Klassen festgelegt.

public class BaseCollection{ 
    protected object[] mList; 
    /* 
    * this has a lot more properties/functions that declare how I prepare 
    * collections for serialization but are superfluous for the conversation, 
    * hence the reason for me wanting to know how to do this 
    */ 
} 

public class ChildCollection : BaseCollection{ 
    [ProtoMember(1)] 
    public Child[] childCollection 
    { 
    get { return mList as Child[]; } 
    set { mList = value; } 
    } 
}