Type []이 객체에 래핑 된 경우에만 직렬화 할 수있는 이유는 무엇입니까?

팀보

protobuf-net으로 예상했던 것보다 더 많은 어려움을 겪고 있습니다. 간단한 케이스에서는 아름답고 빠르고 쉽습니다. 그러나 나는 구타당한 길에서 문제가 있음을 인정합니다. 속성을 사용하는 대신 런타임에서 일부 개체를 직렬화 및 역 직렬화하려고하지만 다양한 문제를 발견했습니다. 첫 번째는 이것입니다. 런타임에서 정수 배열을 직렬화 할 수 있지만 먼저 래핑하지 않는 한 유형은 불가능합니다. 다음은 내가 의미하는 바입니다.

// Fails with 
// System.InvalidOperationException
// Type is not expected, and no contract can be inferred: System.RuntimeType
//   at ProtoBuf.Meta.TypeModel.ThrowUnexpectedType(Type type) in C:\Code\protobuf-net\src\protobuf-net\Meta\TypeModel.cs:line 1471
//   at ProtoBuf.Meta.TypeModel.TrySerializeAuxiliaryType(ProtoWriter writer, Type type, DataFormat format, Int32 tag, Object value, Boolean isInsideList, Object parentList) in C:\Code\protobuf-net\src\protobuf-net\Meta\TypeModel.cs:line 172
//   at ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer, Object value) in C:\Code\protobuf-net\src\protobuf-net\Meta\TypeModel.cs:line 194
//   at ProtoBuf.Meta.TypeModel.Serialize(Stream dest, Object value, SerializationContext context) in C:\Code\protobuf-net\src\protobuf-net\Meta\TypeModel.cs:line 222
//   at ProtoBuf.Serializer.Serialize[T](Stream destination, T instance) in C:\Code\protobuf-net\src\protobuf-net\Serializer.cs:line 93
//   at my bit of code

public static void SerializeMyClass()
{
    using (var ms = new MemoryStream())
    {
        Serializer.Serialize(ms, new[] {typeof(int)});
    }
}
// Works perfectly (and deserializes correctly too, not shown here for brevity)

[ProtoContract]
public class MyClass
{
    [ProtoMember(1)] public Type[] Types;
}

public static void SerializeMyClass()
{
    using (var ms = new MemoryStream())
    {
        Serializer.Serialize(ms, new MyClass {Types = new[] {typeof(int)}});
    }
}

내가 이해하지 못하는 것은 무엇입니까? 타입 배열을 먼저 래핑하지 않고 직렬화 할 수 있습니까? 그렇다면 어떻게해야합니까?

미리 감사드립니다!

마크 그 라벨

여기서 짧은 버전은 다음과 같습니다. Type특수 처리가 있고이 시나리오에서 테스트 및 수정되지 않았기 때문 입니다. 나는 그것이 이상하고 예상치 못한 행동이라는 데 동의 하며이 커밋 의 v3 코드베이스 에서 수정했습니다 . 이 수정 사항은 v2로 다시 포팅되지 않습니다.

페이로드 수준에서는 래핑 된 버전과 래핑되지 않은 버전간에 근본적인 차이가 없으므로 v3 수정없이 여기에 다른 해결 방법은 다음 MyClass과 같습니다. 질문의 코드에있는 것과 똑같이 사용하십시오 .

하나! Type너무 열심히 연재 하지 않도록 주의하겠습니다 . 테스트의 페이로드에서 볼 수 있듯이 Type어셈블리 메타 데이터를 인코딩하기 때문에 어셈블리가 변경되면 어색해질 수 있다는 점에서 불행한 기능이 있습니다. 그리고 .NET Framework와 .NET Core 사이에서 어셈블리가 변경 됩니다. DynamicTypeFormatting유형 모델에 대한 이벤트를 구독하여이 문제를 해결할 수 있지만 ... 이것은 단지 점점 더 많은 작업을하고 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이전에 직렬화 된이 객체를로드 할 수없는 이유는 무엇입니까?

분류에서Dev

Django Rest에서 일대 다 매핑이있는 객체를 직렬화 할 수 없습니다.

분류에서Dev

인터페이스에만 액세스 할 수 있고 직렬화 할 수없는 경우 객체를 복제 할 수 있습니까?

분류에서Dev

클래스의 객체에 정수 값을 할당 할 때 매개 변수화 된 생성자가 호출되는 이유는 무엇입니까?

분류에서Dev

멤버가 직접 직렬화 할 수 없지만 str () 표현이있는 객체를 직렬화하는 방법은 무엇입니까?

분류에서Dev

직렬화가 개인 생성자에 액세스 할 수있는 이유는 무엇입니까?

분류에서Dev

List가 IntoIter에 래핑 된 이유는 무엇입니까?

분류에서Dev

C #에서 개체를 이진 형식으로 직렬화 할 수없는 이유는 무엇입니까?

분류에서Dev

직렬화 된 파일이있는 경우에만 직렬화 해제

분류에서Dev

deinit 메서드가 호출 된 후 객체에 액세스 할 수있는 이유는 무엇입니까?

분류에서Dev

C ++에서 정수 상수를 할당하여 Test 클래스의 객체를 초기화 할 수있는 이유는 무엇입니까?

분류에서Dev

C ++ MFC에서 이진 직렬화 된 개체를 C #에서 역 직렬화 할 수 있습니까?

분류에서Dev

Rest Service에서이 json 객체를 역 직렬화 할 때이 캐스팅 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

중첩 된 객체 목록이있는 객체 목록을 JSON.NET에서 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

Java에서이 생성 된 객체에 액세스 할 수없는 이유는 무엇입니까?

분류에서Dev

직렬화 가능을 구현하지 않아도 객체를 직렬화 할 수있는 이유는 무엇입니까?

분류에서Dev

클래스 확장에 지정된 초기화자를 배치 할 수없는 이유는 무엇입니까?

분류에서Dev

이 래핑 할당 자의 생성자가 템플릿 대체 (완벽한 전달 ctor) 중에 잘못된 유형을받는 이유는 무엇입니까?

분류에서Dev

전달 된 객체를 메서드의 새 값에 할당 할 수없는 이유는 무엇입니까?

분류에서Dev

함수에 전달 된 객체를 설정할 수 없지만 자식으로 설정할 수있는 이유는 무엇입니까?

분류에서Dev

JavaScript에서 참조로 전달 된 객체에 null을 설정할 수없는 이유는 무엇입니까?

분류에서Dev

Kotlin 대신 let scope 함수에 사용 된 객체에 직접 액세스 할 수없는 이유는 무엇입니까?

분류에서Dev

창이 최대화 된 경우에만 메뉴 표시 줄이 나타나는 이유는 무엇입니까?

분류에서Dev

직렬화 / 역 직렬화 후에 UIColor의 값이 변경되는 이유는 무엇입니까?

분류에서Dev

객체가 클래스 변수의 값을 변경할 수있는 이유는 무엇입니까?

분류에서Dev

할당 된 객체의 주소가 C ++에서 변경되지 않는 이유는 무엇입니까?

분류에서Dev

F # 클로저를 직렬화 할 수있는 이유는 무엇입니까?

분류에서Dev

이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

분류에서Dev

이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

Related 관련 기사

  1. 1

    이전에 직렬화 된이 객체를로드 할 수없는 이유는 무엇입니까?

  2. 2

    Django Rest에서 일대 다 매핑이있는 객체를 직렬화 할 수 없습니다.

  3. 3

    인터페이스에만 액세스 할 수 있고 직렬화 할 수없는 경우 객체를 복제 할 수 있습니까?

  4. 4

    클래스의 객체에 정수 값을 할당 할 때 매개 변수화 된 생성자가 호출되는 이유는 무엇입니까?

  5. 5

    멤버가 직접 직렬화 할 수 없지만 str () 표현이있는 객체를 직렬화하는 방법은 무엇입니까?

  6. 6

    직렬화가 개인 생성자에 액세스 할 수있는 이유는 무엇입니까?

  7. 7

    List가 IntoIter에 래핑 된 이유는 무엇입니까?

  8. 8

    C #에서 개체를 이진 형식으로 직렬화 할 수없는 이유는 무엇입니까?

  9. 9

    직렬화 된 파일이있는 경우에만 직렬화 해제

  10. 10

    deinit 메서드가 호출 된 후 객체에 액세스 할 수있는 이유는 무엇입니까?

  11. 11

    C ++에서 정수 상수를 할당하여 Test 클래스의 객체를 초기화 할 수있는 이유는 무엇입니까?

  12. 12

    C ++ MFC에서 이진 직렬화 된 개체를 C #에서 역 직렬화 할 수 있습니까?

  13. 13

    Rest Service에서이 json 객체를 역 직렬화 할 때이 캐스팅 오류가 발생하는 이유는 무엇입니까?

  14. 14

    중첩 된 객체 목록이있는 객체 목록을 JSON.NET에서 역 직렬화하는 방법은 무엇입니까?

  15. 15

    Java에서이 생성 된 객체에 액세스 할 수없는 이유는 무엇입니까?

  16. 16

    직렬화 가능을 구현하지 않아도 객체를 직렬화 할 수있는 이유는 무엇입니까?

  17. 17

    클래스 확장에 지정된 초기화자를 배치 할 수없는 이유는 무엇입니까?

  18. 18

    이 래핑 할당 자의 생성자가 템플릿 대체 (완벽한 전달 ctor) 중에 잘못된 유형을받는 이유는 무엇입니까?

  19. 19

    전달 된 객체를 메서드의 새 값에 할당 할 수없는 이유는 무엇입니까?

  20. 20

    함수에 전달 된 객체를 설정할 수 없지만 자식으로 설정할 수있는 이유는 무엇입니까?

  21. 21

    JavaScript에서 참조로 전달 된 객체에 null을 설정할 수없는 이유는 무엇입니까?

  22. 22

    Kotlin 대신 let scope 함수에 사용 된 객체에 직접 액세스 할 수없는 이유는 무엇입니까?

  23. 23

    창이 최대화 된 경우에만 메뉴 표시 줄이 나타나는 이유는 무엇입니까?

  24. 24

    직렬화 / 역 직렬화 후에 UIColor의 값이 변경되는 이유는 무엇입니까?

  25. 25

    객체가 클래스 변수의 값을 변경할 수있는 이유는 무엇입니까?

  26. 26

    할당 된 객체의 주소가 C ++에서 변경되지 않는 이유는 무엇입니까?

  27. 27

    F # 클로저를 직렬화 할 수있는 이유는 무엇입니까?

  28. 28

    이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

  29. 29

    이미 직렬화 된 클래스를 직렬화 할 수 없습니까?

뜨겁다태그

보관