2010-07-18 2 views
1

나는 이런 종류의 직렬화되지 않는 이유 (Type.IsSerializable() 테스트로)이 형식이 직렬화되지 않는 이유는 무엇입니까?

<Serializable()> _ 
Public MustInherit Class WellKnownInstanceCollectionWithTypedId(Of T As WellKnownInstanceWithTypedId(Of IdT), IdT) 
    Inherits ReadOnlyCollection(Of T) 

    Public Sub New(ByVal list As IList(Of T)) 
     MyBase.New(list) 
    End Sub 


    Public Function GetById(ByVal id As IdT) As T 
     Return Me.FirstOrDefault(Function(item) item.Id.Equals(id)) 
    End Function 

End Class 

내가, 내 GetById 기능을 함께 할 수있는 뭔가가 알고 결정하기 위해 노력하고있어 나는 모든 좋은 것을 제거하면 때문이다. 누군가가이 유형을 직렬화 할 수 있도록 변경해야하는 것을 말해 줄 수 있습니까?

업데이트 : 나는 같은 내 GetById 구현을 변경

, 모든 것이 괜찮습니다. 분명히 이것은 (아래에 제안 된) Linq과 관련이 있습니다 - 왜 이것이 그렇게 자세한 이유를 말해 줄 수 있습니까?

Public Function GetById(ByVal id As IdT) As T 
     For Each i In Me 
      If i.Id.Equals(i) Then 
       Return i 
      End If 
     Next 
     Return Nothing 
    End Function 
+0

직렬화하려고하면 더 자세한 내용이있는 예외가 발생합니다. – Andrey

+0

LINQ ('FirstOrDefault')가 아니라 클로저 ('Function')를 사용하여 로컬 변수에 액세스하는지 확인하고 싶습니다. 경우 매개 변수). 그러나 귀하의 문제를 재현 할 수 없습니다 :'GetType (WellKnownInstanceCollectionWithTypedId (Of,)). IsSerializable'은 .NET 3.5에서 원래의 정의로 "True"를 반환합니다. –

답변

3

그것은 GetById에서 람다 식 (Function)과 관련 될 수 있어야합니다.
호출로 변환하여 VB.NET이 백그라운드 클로저를 만들고 있는지 확인하여 직렬화하는 중입니다.

단지 Return Me.FirstOrDefault(False)에 원래의 코드를 변경, 그것은 LINQ 또는 폐쇄 여부를 테스트하기 위해, 당신의 전체 코드에서
을 (대답 코멘트를 추진).

나는 그것을 다시 직렬화 할 수 있다고 믿습니다. 그렇다면 null을 (Nothing) id에 맞추고 싶지 않으면 동일한 의미를 갖는 Function(Item)... 대신 AddressOf id.Equals을 사용할 수 있습니다.

+0

아주 이상한 ... linq 대신에 InterBase를 사용하기 위해 GetById impl을 대체했을 때 직렬화가 가능해졌습니다 ... 나는 이것에 대한 더 많은 추론을 알고 싶습니다. – DanP

+0

실제로 실제로 linq 함수를 사양으로 외연 화하고 GetById 함수로 대신 이러한 함수를 호출했습니다 (직렬화가 실패한 다른 사례가있었습니다). 매우 이상하지만, 지금은 모든 것이 예상대로 작동합니다 - 힌트를 주셔서 감사합니다! – DanP

2

직렬화 형식은 기본 생성자에게

+0

ReadOnlyCollection에는 읽기 전용 컬렉션이 있으므로 문제가되지 않습니다. – DanP

+0

@DanP 그러나 생성자는 상속되지 않으므로 여전히 문제가 될 수 있습니다. –

+0

글쎄,이 경우에는 문제가되지 않습니다. 내 GetById 메서드의 초기 impl을 제거하면 클래스가 직렬화됩니다. – DanP

관련 문제