2009-05-29 3 views
4

저는 정수, 문자열 및 사용자 정의 유형과 같은 다른 유형의 객체가 포함 된 List<object>을 보유하고 있습니다. 모든 사용자 정의 유형이 프로토 타입 조정됩니다. 내가 지금하고 싶은 것은 protobuf.net으로이리스트를 직렬화/비 직렬화하는 것이다. 지금까지 나는 각 타입을 명시 적으로 선언해야한다고 생각합니다. 불행히도 이러한 혼합리스트 구조에서는 불가능합니다. 바이너리 포맷 작성자는 이러한 작업을 수행하는 데 아무런 문제가 없기 때문에 무언가를 놓쳤다는 사실을 알고 나에게 도움을 줄 수 있기를 바랍니다. 그래서 내 질문에 protobuf.net에서 개체를 처리하는 방법입니다.protobuf 및 목록 <object> - 직렬화/역 직렬화하는 방법?

+1

(예 추가) –

+0

:


이 적합하지 않습니다,하지만 내가 런타임 스키마를 지원하는 작업을 완료 할 때 쉽게해야 ... 작동 예를 들어 10,000 개가 넘는 요소가있는 목록을 직렬화하는 데 얼마나 많은 데이터가 소비 될지 말해 주시겠습니까? – LoveToCode

답변

10

(공개 : 나는 protobuf - 그물의 저자 해요)

BinaryFormatter는 메타 데이터 기반의 시리얼입니다 즉, 직렬화 된 모든 객체에 대한 .NET 유형 정보를 보냅니다. protobuf-net은 계약 기반 시리얼 라이저 (XmlSerializer/DataContractSerializer의 이진 파일로, 이것을 거부합니다). 방법 당신이 보내는 것을 알가 없습니다 다른 말 이후, 임의 객체를 전송하기위한 전류 메커니즘이 없습니다

; 당신이있는 경우 그러나, 알려진 당신이있을 수 있습니다 옵션을 보낼 다른 개체 유형의을 설정합니다. 또한 파이프 라인에서 런타임에 확장 가능한 스키마 (빌드시 고정되는 속성이 아닌)를 허용하는 작업이 있지만 이는 아직 완료되지 않았습니다. 제발

using System; 
using System.Collections.Generic; 
using ProtoBuf; 
[ProtoContract] 
[ProtoInclude(10, typeof(DataItem<int>))] 
[ProtoInclude(11, typeof(DataItem<string>))] 
[ProtoInclude(12, typeof(DataItem<DateTime>))] 
[ProtoInclude(13, typeof(DataItem<Foo>))] 
abstract class DataItem { 
    public static DataItem<T> Create<T>(T value) { 
     return new DataItem<T>(value); 
    } 
    public object Value { 
     get { return ValueImpl; } 
     set { ValueImpl = value; } 
    } 
    protected abstract object ValueImpl {get;set;} 
    protected DataItem() { } 
} 
[ProtoContract] 
sealed class DataItem<T> : DataItem { 
    public DataItem() { } 
    public DataItem(T value) { Value = value; } 
    [ProtoMember(1)] 
    public new T Value { get; set; } 
    protected override object ValueImpl { 
     get { return Value; } 
     set { Value = (T)value; } 
    } 
} 
[ProtoContract] 
public class Foo { 
    [ProtoMember(1)] 
    public string Bar { get; set; } 
    public override string ToString() { 
     return "Foo with Bar=" + Bar; 
    } 
} 
static class Program { 
    static void Main() { 
     var items = new List<DataItem>(); 
     items.Add(DataItem.Create(12345)); 
     items.Add(DataItem.Create(DateTime.Today)); 
     items.Add(DataItem.Create("abcde")); 
     items.Add(DataItem.Create(new Foo { Bar = "Marc" })); 
     items.Add(DataItem.Create(67890)); 

     // serialize and deserialize 
     var clone = Serializer.DeepClone(items); 
     foreach (DataItem item in clone) { 
      Console.WriteLine(item.Value); 
     } 
    } 
} 
+0

감사합니다. Gravell, 사실 저는 당신의 작업을 진심으로 좋아하며 직접 답변을 받기를 바랍니다. 어떤 데이터 유형이 목록에 있는지 알고 있으므로 솔루션에 대해 궁금합니다. –

+0

감사 Gravell, 당신은 당신이 런타임 스키마의 지원을 끝낼 때 견적을 줄 수 있습니까? –

+0

나는 차라리 그렇지 않다. 이전에 견적을 제출했는데 적합하지 않았습니다 ... 최적화하기 전에 많은 경우에 적합합니다. 추측해야한다면, 나는 자유 시간 (나는 예상하지 못함)을 얻지 않는 한, 몇 달 더 걸릴 것이라고 생각한다. 또한 "트렁크"를 최신 유선 형식 변경으로 최신 상태로 유지하려고 노력하고 있습니다. –

0
List<YourClass> list; 
ProtoBuf.Serializer.Deserialize<List<YourClass>>(filestream); 
+0

여분의'>'입니까? – Robert

관련 문제