저는 정수, 문자열 및 사용자 정의 유형과 같은 다른 유형의 객체가 포함 된 List<object>
을 보유하고 있습니다. 모든 사용자 정의 유형이 프로토 타입 조정됩니다. 내가 지금하고 싶은 것은 protobuf.net으로이리스트를 직렬화/비 직렬화하는 것이다. 지금까지 나는 각 타입을 명시 적으로 선언해야한다고 생각합니다. 불행히도 이러한 혼합리스트 구조에서는 불가능합니다. 바이너리 포맷 작성자는 이러한 작업을 수행하는 데 아무런 문제가 없기 때문에 무언가를 놓쳤다는 사실을 알고 나에게 도움을 줄 수 있기를 바랍니다. 그래서 내 질문에 protobuf.net에서 개체를 처리하는 방법입니다.protobuf 및 목록 <object> - 직렬화/역 직렬화하는 방법?
답변
(공개 : 나는 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);
}
}
}
감사합니다. Gravell, 사실 저는 당신의 작업을 진심으로 좋아하며 직접 답변을 받기를 바랍니다. 어떤 데이터 유형이 목록에 있는지 알고 있으므로 솔루션에 대해 궁금합니다. –
감사 Gravell, 당신은 당신이 런타임 스키마의 지원을 끝낼 때 견적을 줄 수 있습니까? –
나는 차라리 그렇지 않다. 이전에 견적을 제출했는데 적합하지 않았습니다 ... 최적화하기 전에 많은 경우에 적합합니다. 추측해야한다면, 나는 자유 시간 (나는 예상하지 못함)을 얻지 않는 한, 몇 달 더 걸릴 것이라고 생각한다. 또한 "트렁크"를 최신 유선 형식 변경으로 최신 상태로 유지하려고 노력하고 있습니다. –
List<YourClass> list;
ProtoBuf.Serializer.Deserialize<List<YourClass>>(filestream);
여분의'>'입니까? – Robert
- 1. protobuf-net에 클래스를 추가하는 방법
- 2. protobuf-net : 잘못된 와이어 유형 예외를 역 직렬화하는 Guid 속성
- 3. protobuf .NET으로 인터페이스 유형 멤버를 직렬화하는 방법은 무엇입니까?
- 4. Protobuf/Protobuf-net을 사용하여 일부 개체 상속의 목록/배열을 사용하는 방법?
- 5. bbfreeze 및 protobuf
- 6. protobuf?
- 7. protobuf 내의 문자열 제한
- 8. WPF 그리기를 직렬화하는 방법?
- 9. protobuf-net의 사용자 정의 직렬화/직렬화 해제 방법
- 10. RESTful .NET 및 protobuf-net
- 11. protobuf-net 및 인터페이스 지원
- 12. XML에 ArrayList를 직렬화하는 방법
- 13. 안정적으로 데이터를 직렬화하는 방법
- 14. Qt에서 JSON에 직렬화하는 방법
- 15. fusion :: vector를 직렬화하는 방법?
- 16. C에서 데이터를 직렬화하는 방법
- 17. PHP에서 protobuf 직렬화를 수행하는 방법
- 18. 내가 <a href="http://code.google.com/p/protobuf-net/" rel="nofollow">protobuf-net</a>을 사용하고
- 19. protobuf-net-VS10.msi 및 V2와 호환됩니까?
- 20. Silverlight에서 파생 클래스를 직렬화하는 방법
- 21. 목록 <T> 및 GridView 바인딩
- 22. protobuf-net 및 sql server ce
- 23. ActiveRecord의 해시 배열을 직렬화하는 방법?
- 24. PHP 개체의 배열을 직렬화하는 방법?
- 25. MonoTouch에서 System.Json을 사용하여 직렬화하는 방법
- 26. 자바에서 JSON 객체를 직렬화하는 방법
- 27. protobuf 메시지가 protobuf 버전간에 호환 가능합니까?
- 28. IPhone SDK - ABRecord를 직렬화하는 방법?
- 29. System.Net.Mime.ContentType 형식의 개체를 직렬화하는 방법?
- 30. XML 속성을 역 직렬화하는 방법
(예 추가) –
:
이 적합하지 않습니다,하지만 내가 런타임 스키마를 지원하는 작업을 완료 할 때 쉽게해야 ... 작동 예를 들어 10,000 개가 넘는 요소가있는 목록을 직렬화하는 데 얼마나 많은 데이터가 소비 될지 말해 주시겠습니까? – LoveToCode