BinaryFormatter를 사용하여 역 직렬화하는 동안 요소 건너 뛰기

역 직렬화 할 때 직렬화 된 스트림의 다음 '항목'을 건너 뛸 수 있습니까? 플러그인 지향 아키텍처와 관련하여 직렬화 된 개체 그래프의 개별 부분이 다른 환경에서 알 수없는 유형이 될 수 있습니다 (안전하게 무시할 수 있다고 가정). 이들을 역 직렬화하려고하면 물론 실패합니다.

abstract class Thing{}
class OneThing : Thing {}  // <-- known in environment A & B
class SomeThing : Thing {} // <-- only known in environment A
...
var things = new List<Thing>();
...
things.Add(  (OneThing)(formatter.Deserialize(stream)) );
things.Add( (SomeThing)(formatter.Deserialize(stream)) ); // <-- skip in B
things.Add(  (OneThing)(formatter.Deserialize(stream)) );

바이너리 포맷터로 어떻게 작동합니까? 길이를 계산하고 직렬화 된 항목의 모호하지 않은 유형 이름 (예 : 문자열)을 검색하고 항목 바로 앞에 저장해야하나요? 그러면 직렬화 해제 할 때 건너 뛸 수 있습니다 (스트림 포인터를 증가시켜)? 아니면 직렬화 된 표현의 문제가 적은 조작으로 더 나은 대안이 있습니까?

나는 포인터를 증가 시켜서 스트림 부분을 간단히 건너 뛰는 버전을 시도했다. 현재로서는 이것이 나를 위해 작동합니다 (가장 좋은 해결책이 아닐 수도 있음).

interface ISerializableObject { }

class PluginSerialization
{
    private readonly IFormatter formatter;

    public PluginSerialization(IFormatter f)
    {
        formatter = f;
    }

    public void SerializeToStream(IEnumerable<ISerializableObject> components, Stream s)
    {
        foreach (var component in components)
        {
            using (var cStream = new MemoryStream())
            {
                formatter.Serialize(cStream, component);
                cStream.Flush();

                // write to stream [length] [type as string] [object]
                formatter.Serialize(s, cStream.Length);
                formatter.Serialize(s, component.GetType().ToString());
                cStream.WriteTo(s);
            }
        }
    }

    public List<ISerializableObject> DeserializeFromStream(Stream s, Func<string, bool> isKnownType )
    {
        var components = new List<ISerializableObject>();

        while (s.Position < s.Length - 1)
        {
            var length = (long)(formatter.Deserialize(s));
            var name = (string)(formatter.Deserialize(s));

            // skip unknown types
            if (!isKnownType(name))
            {
                s.Position += length;
                continue;
            }

            components.Add((ISerializableObject) (formatter.Deserialize(s)));                
        }

        return components;
    }
}

이를 통해 다른 객체 목록 ( List<ISerializableObject>()) 을 부분적으로 역 직렬화 할 수 있습니다 . 그러나 데이터가 저장되는 방식과 순서 (길이, 유형 이름, 객체)는 특정 구현 세부 사항이므로 가능한 한 최대한 캡슐화해야합니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

for 루프로 슬라이스를 반복하는 동안 요소 건너 뛰기

분류에서Dev

요소를 추출하는 동안 루프없이 "#"기호를 건너 뛰려면 어떻게합니까?

분류에서Dev

itertools 및 동반 목록을 사용하여 요소 패턴 건너 뛰기

분류에서Dev

벡터를 반복하는 동안 줄 건너 뛰기

분류에서Dev

group by를 사용하는 동안 select 절의 속성 건너 뛰기

분류에서Dev

jsPDF를 사용하는 동안 열을 건너 뛰는 방법

분류에서Dev

PHP에서 연결하는 동안 빈 변수를 건너 뛰는 기능

분류에서Dev

Rails 레코드 세트를 반복하는 동안 nil 객체 건너 뛰기

분류에서Dev

요소 이름이 다른 동일한 개체를 사용하여 XML 역 직렬화

분류에서Dev

비동기를 사용하는 동안 건너 뛴 프레임

분류에서Dev

SQL에서 LAG를 사용하여 특정 행 건너 뛰기

분류에서Dev

Pandas를 사용하여 "#"로 표시된 행 건너 뛰기

분류에서Dev

GoTo (재귀)를 사용하여 코드 건너 뛰기

분류에서Dev

부팅하는 동안 rc.local 건너 뛰기

분류에서Dev

부팅하는 동안 rc.local 건너 뛰기

분류에서Dev

FREAD를 사용하여 CSV 파일을 R로 가져 오는 동안 특정 값으로 시작하는 행 건너 뛰기

분류에서Dev

Jsonsoft를 사용하여 역 직렬화하는 동안 단일 줄 문자열이 실패합니다.

분류에서Dev

Javafx : Listview에 고유 한 요소를 추가하는 방법 (예 : 중복 요소 건너 뛰기)

분류에서Dev

azure devops rest api를 사용하여 단계 건너 뛰기가 작동하지 않습니다.

분류에서Dev

루프를하는 동안 내용이없는 whch 파일 이름 건너 뛰기

분류에서Dev

잭슨 : 역 직렬화하는 XML 목록에 너무 많은 요소를 제공합니다

분류에서Dev

특정 요소를 건너 뛰는 사용자 지정 xmlWriter?

분류에서Dev

Ext JS 저장소에서 json 데이터를 역 직렬화하는 동안 모델 유형 구별

분류에서Dev

Piglatin을 사용하여 텍스트 파일을로드하는 동안 헤더 건너 뛰기

분류에서Dev

'next'메소드를 사용하여 Ruby의 .each 루프에서 항목 건너 뛰기

분류에서Dev

건너 뛰기 목록에서 대체 요소를 수직 검색 노드로 사용하지 않는 이유는 무엇입니까?

분류에서Dev

기사를 건너 뛰는 Google Feed API?

분류에서Dev

SQL-LEAD를 사용하여 특정 조건의 행 건너 뛰기

분류에서Dev

JS에서 함수를 호출하는 동안 기본값으로 매개 변수 생략 / 건너 뛰기

Related 관련 기사

  1. 1

    for 루프로 슬라이스를 반복하는 동안 요소 건너 뛰기

  2. 2

    요소를 추출하는 동안 루프없이 "#"기호를 건너 뛰려면 어떻게합니까?

  3. 3

    itertools 및 동반 목록을 사용하여 요소 패턴 건너 뛰기

  4. 4

    벡터를 반복하는 동안 줄 건너 뛰기

  5. 5

    group by를 사용하는 동안 select 절의 속성 건너 뛰기

  6. 6

    jsPDF를 사용하는 동안 열을 건너 뛰는 방법

  7. 7

    PHP에서 연결하는 동안 빈 변수를 건너 뛰는 기능

  8. 8

    Rails 레코드 세트를 반복하는 동안 nil 객체 건너 뛰기

  9. 9

    요소 이름이 다른 동일한 개체를 사용하여 XML 역 직렬화

  10. 10

    비동기를 사용하는 동안 건너 뛴 프레임

  11. 11

    SQL에서 LAG를 사용하여 특정 행 건너 뛰기

  12. 12

    Pandas를 사용하여 "#"로 표시된 행 건너 뛰기

  13. 13

    GoTo (재귀)를 사용하여 코드 건너 뛰기

  14. 14

    부팅하는 동안 rc.local 건너 뛰기

  15. 15

    부팅하는 동안 rc.local 건너 뛰기

  16. 16

    FREAD를 사용하여 CSV 파일을 R로 가져 오는 동안 특정 값으로 시작하는 행 건너 뛰기

  17. 17

    Jsonsoft를 사용하여 역 직렬화하는 동안 단일 줄 문자열이 실패합니다.

  18. 18

    Javafx : Listview에 고유 한 요소를 추가하는 방법 (예 : 중복 요소 건너 뛰기)

  19. 19

    azure devops rest api를 사용하여 단계 건너 뛰기가 작동하지 않습니다.

  20. 20

    루프를하는 동안 내용이없는 whch 파일 이름 건너 뛰기

  21. 21

    잭슨 : 역 직렬화하는 XML 목록에 너무 많은 요소를 제공합니다

  22. 22

    특정 요소를 건너 뛰는 사용자 지정 xmlWriter?

  23. 23

    Ext JS 저장소에서 json 데이터를 역 직렬화하는 동안 모델 유형 구별

  24. 24

    Piglatin을 사용하여 텍스트 파일을로드하는 동안 헤더 건너 뛰기

  25. 25

    'next'메소드를 사용하여 Ruby의 .each 루프에서 항목 건너 뛰기

  26. 26

    건너 뛰기 목록에서 대체 요소를 수직 검색 노드로 사용하지 않는 이유는 무엇입니까?

  27. 27

    기사를 건너 뛰는 Google Feed API?

  28. 28

    SQL-LEAD를 사용하여 특정 조건의 행 건너 뛰기

  29. 29

    JS에서 함수를 호출하는 동안 기본값으로 매개 변수 생략 / 건너 뛰기

뜨겁다태그

보관