파일에 데이터를 저장하는 라이브러리를 교체해야합니다 (serialize/deserialize) 이 라이브러리는 현재 BinaryFormatter를 사용하지만 큰 목록에는 속도가 느립니다. 여기에 많은 게시물 stackoverflow에 protobuf 정말 performant 보여, 그래서 그것을 사용하려고합니다. 많은 코드를 다시 작성하지 않고도 교체를 만들기 위해protobuf로 binaryformatter 바꾸기
, 내 요구 사항은 다음과 같습니다 나는 (대부분의 시간 T가 DataContract와 함께 표시됩니다 Store<T>(T data)
와 인터페이스했듯이
- 는 일반 데이터를 직렬화해야/또는 Serializable 특성)
- protobuf 특성을 추가하기 위해 모든 다른 objets 클래스를 수정할 수 없으므로이 특성을 사용하지 않는 일반 메서드가 필요합니다.
- T 객체 스키마 변경 (즉, 새 속성), 생성 된 모든 파일은 더 이상 사용되지 않으며 삭제됩니다/다시
내 제 순진 구현은 다음과 같습니다 :이 예외를 가지고 다음
public bool Store<T>(string key, T data)
{
var formatter = Serializer.CreateFormatter<T>();
using (var fileStream = new FileStream(this.GetFilePath(key), FileMode.Create))
{
formatter.Serialize(fileStream, data);
return true;
}
}
하지만을 :
유형이 예상되지 않습니다, 어떤 계약 유추 할 수 없습니다 : 내를 .Application.Namespace.ShortcutData
현재 저는 조금 붙어 있습니다. protobuf-net을 사용하는 방법에 대한 좋은 지침서를 찾지 못했습니다.
protobuf를 사용하여 이러한 요구 사항에 도달 할 수 있습니까? 이 작업을 수행하는 방법에 대한 좋은 지침이 있습니까?
편집 :
문제는 참으로 내가 (드) 데이터를 직렬화하는 방법을 protobuf 말할 필요가있다. 여기 내가 지금 무엇을 가지고 :
주요 코드 등록 방법에public bool Store<T>(string key, T data)
{
this.Register<T>();
var formatter = Serializer.CreateFormatter<T>();
using (var fileStream = new FileStream(this.GetFilePath(key), FileMode.Create))
{
formatter.Serialize(fileStream, data);
fileStream.Close();
return true;
}
}
:이 깨끗한 코드가 아닙니다 알고
protected void Register(Type type)
{
if (type.IsGenericType)
{
var arguments = type.GetGenericArguments();
foreach (var argument in arguments)
this.Register(argument);
}
if (!this._registeredTypes.Contains(type) && !type.IsValueType)
{
this._registeredTypes.Add(type);
var properties = type.GetProperties();
foreach (var property in properties)
{
this.Register(property.PropertyType);
}
try
{
ProtoBuf.Meta.RuntimeTypeModel.Default
.Add(type, false)
.Add(properties
.Where(p => p.CanWrite)
.OrderBy(x => x.Name)
.Select(x => x.Name)
.ToArray());
}
catch
{
// I've a problem here: I sometime have an error for an already registered type (??)
}
}
}
, 그러나 이것은 기존의 단지에서-대체 코드와 함께 protobuf와 완전한 재 작성은 두 번째 단계로 이어질 것입니다.
'GetProperties()'는 순서에 대해 아무런 보장도하지 않으며 암시 적 필드 번호를 결정하기 때문에 순서가 실제로 중요합니다. –
나는 생각났다. 그러나 내가 말했듯이 : 개념 증명. 내가 물건을 주문하면 그 차이가 생길까요? 내 실제 코드는 이제 필자가 특별히 작성해야하는 것을보다 효과적으로 제어 할 수 있도록 ProtoReader와 ProtoWriter를 향하고있다. GetProperties 호출을 제외하고 덜 취약하도록하는 권장 사항이 있습니까? –
'ProtoReader'와'ProtoWriter'는 protobuf-net이 내부적으로 필요로하는 것에 매우 적합합니다; 물론 직접 사용할 수도 있지만 일반적으로 사용되는 것은 아닙니다. 다시 덜 부서지기 쉽습니다. 솔직히 말해서, 나는 속성 접근법을 사용합니다. 더 간단합니다. 직렬화하려는 유형이 사용자가 아닌 경우 : 직렬화 대리를 사용하거나 직렬화를 위해 별도의 DTO 모델을 작성하십시오. –