Brian Sullivan
그는 물었다 12년 전
50

C # 유형: 객체에는 직렬화할 수 있습니까?

39 m, 다음과 같은 방법으로 문자 객체에는 i& 직렬화할 위해 노력하고 있다.

Type myType = typeof (StringBuilder);
var serializer = new XmlSerializer(typeof(Type));
TextWriter writer = new StringWriter();
serializer.Serialize(writer, myType);

이 때 나는한다 직렬화할 호출이 던지고 다음 예외가 발생합니다.

&gt. 유형, 시스템스테스트리스트링부이더 &quot 않은 것으로 나타났다. List. &gt. 속성 또는 소아핀클로드 스마링크루드 유형을 지정할 수 없는 &gt. 알려진 statically.&quot.

이 방법이 나에게 '유형' 객체에는 직렬화할? 참고로 나는 '이 아니라' 유형 '객체에는 스트라이베이더 직렬화할 시도하지 않을 것' '스트라이베이더 대한 메타데이터를 포함하는' 클래스.

Keith
그는 12년 전 댓글을 달았습니다
2

왜 에는 직렬화 유형? 이 경우, 이를 사용할 경우 t # 39 는 .Net can& 데즈리얼리사션 없는 그런 전달하는 데 필요한 모든 것은 정식 이름.

YMC
그는 4년 전 댓글을 달았습니다
0

Net 에서는 6.1 이 정확한 코드를 idfsysobject. 제기한다. Xml 문서의 생성 오류가 발생했습니다. 시스템.런타임티페 보호 수준을 하기 때문에 액세스할 수 없습니다. 전용 공공 유형을 처리할 수 있습니다.

답변 6 개

39 만 t, 내가 알고 있는 wasn& 문자열으로 fully-qualified 이름이 포함된 문자 오브젝트를 생성할 수 있습니다. 다음 완전한 이름을 얻기 위해 사용할 수 있습니다.

string typeName = typeof (StringBuilder).FullName;

그러나 이 후, 그런 다음 필요한 옛일에 문자열이어야 재구성합니다 유형: 다음과 같습니다.

Type t = Type.GetType(typeName);

유형의 인스턴스를 만드는 데 필요한 경우, 이 작업을 수행할 수 있습니다.

object o = Activator.CreateInstance(t);

값을 선택하면 o. 스트라이베이더 때와 같은 방식으로 게티페 () 될 것으로 기대하고 있다.

GreyCloud
그는 10년 전 댓글을 달았습니다
6

메리 페리게티페 (유형 이름) 수 있다고 경고했다. 이와 같은 유형에 대한 조립품을 호출하십시오 거역한다면 사용할 수 있습니다.

GreyCloud
그는 10년 전 댓글을 달았습니다
42

이 솔루션은 아서 블라이퀄리피들나미 사용할 수 있는 게 아니라 전체

Beriz
그는 8년 전 댓글을 달았습니다
6

일반 페일오버됩니다 메리 페리게티페 () 의 종류.

난 이미 같은 문제, 내 솔루션이므로 세리아리자블티페 클래스 만드는 것이었다. 하지만 정보기술 (it) 에 따라 자유롭게 변환하고 시스템스티페 직렬화할 구체화하십시오. 네가 해야 할 일은 이 변수를 선언할 비호환성의 세리아리자블티페 및 높여가면서 점프 시스템스티페스 정보기술 (it) 을 참조할 수 있습니다

다음은 클래스:

// a version of System.Type that can be serialized
[DataContract]
public class SerializableType
{
    public Type type;

    // when serializing, store as a string
    [DataMember]
    string TypeString
    {
        get
        {
            if (type == null)
                return null;
            return type.FullName;
        }
        set
        {
            if (value == null)
                type = null;
            else
            {
                type = Type.GetType(value);
            }
        }
    }

    // constructors
    public SerializableType()
    {
        type = null;
    }
    public SerializableType(Type t)
    {
        type = t;
    }

    // allow SerializableType to implicitly be converted to and from System.Type
    static public implicit operator Type(SerializableType stype)
    {
        return stype.type;
    }
    static public implicit operator SerializableType(Type t)
    {
        return new SerializableType(t);
    }

    // overload the == and != operators
    public static bool operator ==(SerializableType a, SerializableType b)
    {
        // If both are null, or both are same instance, return true.
        if (System.Object.ReferenceEquals(a, b))
        {
            return true;
        }

        // If one is null, but not both, return false.
        if (((object)a == null) || ((object)b == null))
        {
            return false;
        }

        // Return true if the fields match:
        return a.type == b.type;
    }
    public static bool operator !=(SerializableType a, SerializableType b)
    {
        return !(a == b);
    }
    // we don't need to overload operators between SerializableType and System.Type because we already enabled them to implicitly convert

    public override int GetHashCode()
    {
        return type.GetHashCode();
    }

    // overload the .Equals method
    public override bool Equals(System.Object obj)
    {
        // If parameter is null return false.
        if (obj == null)
        {
            return false;
        }

        // If parameter cannot be cast to SerializableType return false.
        SerializableType p = obj as SerializableType;
        if ((System.Object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (type == p.type);
    }
    public bool Equals(SerializableType p)
    {
        // If parameter is null return false:
        if ((object)p == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (type == p.type);
    }
}

및 사용 예:

[DataContract]
public class A
{

    ...

    [DataMember]
    private Dictionary<SerializableType, B> _bees;

    ...

    public B GetB(Type type)
    {
        return _bees[type];
    }

    ...

}

대신 사용을 고려해보십시오 아서 블라이퀄리피들나미 메리 페이스풀나미 의해 주석문입니다 @GreyCloud 볼 수도 있습니다.

hypehuman
Askolein
그는 6년 전 댓글을 달았습니다
1

39 의 질문에 말을 따르면 OP& 오토메이티드 +1 해야 합니다.

Zachary Canann
그는 3년 전 댓글을 달았습니다
1

+1 또 ' ()' 이 아니라 '반품하십시오 반환되기를 toString 재정의을 형성할 수 있습니다. 유형? (), '이 클래스 등 네스토스트링 사용하는 것과 일반 문자 클래스 어디든요 완벽하게 사용할 수 있습니다.

# 39 의 Brian& 오토메이티드 제대로 유형이 같은 조립품을 호츨 같은 경우 (예 중 하나로 그레이스루드 지적했다 (주석). 만일 유형이 다른 통합자에서 조립품을 사용해야 하는 [아서 블라이퀄리피들나미] [2] 로 그레이스루드 또한 지적했다.

그러나 같은 [아서 블라이퀄리피들나미] [2] 의 경우 버전, 절약합니다 투명지에 어셈블리들 한 가지는 다른 버전이 문자열이어야 유형, it won& # 39, 빗나갔다.

내 경우 이 문제를 해결할 쉐퍼드도 인턴이었을때를 it 다음과 같습니다.

string typeName = typeof (MyClass).FullName;

Type type = GetTypeFrom(typeName);

object myInstance = Activator.CreateInstance(type);

    • 게티페프롬 방법

private Type GetTypeFrom(string valueType)
    {
        var type = Type.GetType(valueType);
        if (type != null)
            return type;

        try
        {
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();                

            //To speed things up, we check first in the already loaded assemblies.
            foreach (var assembly in assemblies)
            {
                type = assembly.GetType(valueType);
                if (type != null)
                    break;
            }
            if (type != null)
                return type;

            var loadedAssemblies = assemblies.ToList();

            foreach (var loadedAssembly in assemblies)
            {
                foreach (AssemblyName referencedAssemblyName in loadedAssembly.GetReferencedAssemblies())
                {
                    var found = loadedAssemblies.All(x => x.GetName() != referencedAssemblyName);

                    if (!found)
                    {
                        try
                        {
                            var referencedAssembly = Assembly.Load(referencedAssemblyName);
                            type = referencedAssembly.GetType(valueType);
                            if (type != null)
                                break;
                            loadedAssemblies.Add(referencedAssembly);
                        }
                        catch
                        {
                            //We will ignore this, because the Type might still be in one of the other Assemblies.
                        }
                    }
                }
            }                
        }
        catch(Exception exception)
        {
            //throw my custom exception    
        }

        if (type == null)
        {
            //throw my custom exception.
        }

        return type;
    }

나는 이 글을 다른 사람이 필요할 경우.

[2]: http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname% 110%29.aspx 28v = vs.

Msdn 설명서에 따르면 시스템스티페 [1] 이 시스템스티페 객체에는 직렬화할 수 있어야 합니다. 그러나 오류: 시스템스테스트리스트링부이더 명시적으로 언급하고 있는 것, 즉 클래스 일으키는 직렬화하지 오류:.

[1] http://msdn.microsoft.com/en-us/library/system.type.aspx 문자 클래스 (System) -

정의를 바라볼 것이 아니라 그냥 표시된 시리얼화가 가능합니다. 이 경우, 그러면 정말로 필요한 데이터를 직렬화할 스크램블된 변환할지 redhat. 표시된 맞춤형 교육 등 있을 수 있습니다.

public abstract class Type : System.Reflection.MemberInfo
    Member of System

Summary:
Represents type declarations: class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types.

Attributes:
[System.Runtime.InteropServices.ClassInterfaceAttribute(0),
System.Runtime.InteropServices.ComDefaultInterfaceAttribute(System.Runtime.InteropServices._Type),
System.Runtime.InteropServices.ComVisibleAttribute(true)]

Felix K.
그는 8년 전 댓글을 달았습니다
2

그러나 구체적인 구현 ',' 그렇지 않다 '는' 시스템.런타임티페 시스템스티페 직렬화할 수 없습니다.

bjhuffine
그는 5년 전 댓글을 달았습니다
0

이제는 데코레이팅된 함께 속성용 시리얼화가 가능합니다.

이 문제를 통해 .net 에서는 표준 2.0 바이너리 직렬화하지 못하며창조된 하고 왔는지. 내가 사용하는 사용자 정의 '' 와 '세리얼리제이션빈더 수호가테셀레스 됐지 문제 해결'.

이 때문에 '는' 필수 '는' 티페즈리얼리제이션빈더 프레임워크입니다 mpfs 시스템.런타임티페 해결하십시오 전에 수호가테셀레스 잡을라는데 ''. 내가 왜 이 단계를 전에 해결해야 입력하십시ᄃ오 don& # 39 어쨌든요 이해할 수 없다.

다음은 코드:

"'c # 직렬화할 및 데즈리얼리제스 시스템스티페 // public class 티페즈리얼리제이션수로게이트: 이즈리얼리제이션수로게이트 { public void 제로비치다타 (객체에는 세리얼리제이션린포 obj, 정보, 스트림링콘테스트 컨텍스트로) { 정보. 아다발루 (나미로프 (메리 페이스풀나미), (목표 유형) 이 스풀나미); }

세트로비치 다다 공용 객체 (object obj, 정보, 스트림링콘테스트 세리얼리제이션린포 컨텍스트로 아우로가테셀레스 선택기를) { 메리 페리게티페 반품하십시오 (린포드제스트링 (나미로프 (메리 페이스풀나미))); } }

39 구현, 단순한 스터브에 doesn& // 필요한 건 아니다.

public class 티페스터브: 문자 {. }

// 바인딩됩니다 System.RuntimeType&quot "; 우리 티페스터브 public class 티페즈리얼리제이션빈더: 세리얼리제이션빈더 { 공용 오버라이드합니다 빈트로이파 유형 (구체화하십시오 아서 블라이나미, 문자열 유형 이름) { if (= &quot System.RuntimeType&quot 유형 이름;;) { 메리 페로프 반품하십시오 (티페스터브); } 메리 페리게티페 반품하십시오 ($ {}}, {아서 블라이나미 &quot 유형 이름 ";). } }

[드] 직렬화하는 중 유형을 선택한 아웃해야 때 티페즈리얼리제이션수로게이트 // public class 타이페서로가테셀레스: 아우로가테셀레스 { public void 하인셀레스 가상 (아우로가테셀레스 선택기를) = &gt. 새로운 것을 노스럽포르테데스세페시옹 ();

공용 가상 아우로가테셀레스 제네스체레스 () = &gt. 새로운 것을 노스럽포르테데스세페시옹 ();

공용 가상 이즈리얼리제이션수로게이트 제수로게이트 (유형, 스트림링콘테스트 컨텍스트로 내려졌단 아우로가테셀레스 선택기를) { if (메리 페로프 (유형용) 스리자시냐블레프롬 (type) { 선택기를 = 이. 새로운 티페즈리얼리제이션수로게이트 복귀하십시오 (); } 선택기를 = null; 반품하십시오 nulll. } } "'

사용 예제: "'c # [] 바이트입니다 바이트입니다 var 세리얼리제퍼매터 = new 비나리포매터 () { 수호가테셀레스 = new 타이페서로가테셀레스 () } 사용 (var = new 스트리밍합니다 미모리스트림 () { 세리얼리제프로마테리즈리얼리즈 (스트림, 메리 페로프 (string)); 바이트입니다 = 스트리밍합니다. 토라리 (); }

var 데즈리얼리제퍼매터 = new 비나리포매터 () { 수호가테셀레스 = new 타이페서로가테셀레스 (), 바인더 = new 메리 페데즈리얼리제이션빈더 () } 사용 (var = new 스트리밍합니다 미모리스트림 (바이트입니다) { 유형 (Type) = 데즈리얼리제퍼매터 이즈리얼리즈 (stream); 아스트리스콸 (메리 페로프 (string), 유형용). } "'