2010-06-16 3 views
3

Visual Studio에서 개체를 settings.settings 파일에 저장할 수 있습니까? 그렇다면 어떻게? 나는 당신이 당신의 객체를 직렬화 할 수 있고 그것이 지속되어야한다고 생각하지만, 나는 그것을 제대로 수행하고 있는지 확실하지 않다. 즉, 객체를 다시 얻으려고 할 때 항상 null이다.Visual Studio에서 어떻게 fooSettings.settings 파일에 개체를 저장합니까?

[Serializable()] 
    [XmlRoot(ElementName = "LayerTCA", IsNullable = false, Namespace = "http://somesite.com")] 
    public class LayerTCA 
    { 
     //This is a COM object so I don't want to serialize this. 
     IFeatureClass featureClass; 

     string fullName; 
     string basicName; 

     public LayerTCA() 
     { 

     } 

     public LayerTCA(IFeatureClass featureClass) 
     { 
      FeatureClass = featureClass; 
     } 


     public IFeatureClass FeatureClass 
     { 
      get { return featureClass; } 
      set 
      { 
       featureClass = value; 
       fullName = featureClass.AliasName; 
       basicName = StringHelper.StringAfterLastFullStop(fullName); 
      } 
     } 

     [XmlAttribute(AttributeName = "BasicName")] 
     public string BasicName 
     { 
      get { return basicName; } 
      set { basicName = value; } 
     } 


     [XmlAttribute(AttributeName = "FullName")] 
     public string FullName 
     { 
      get { return fullName; } 
      set { fullName = value; } 
     } 

     public override string ToString() 
     { 
      return FullName; 
     } 

    } 
+0

직렬화/직렬화 코드를 추가 할 수 있습니까? – Rox

+0

객체를 저장하기위한 fooSettings.settings의 정적 호출 즉, var layerTCA = new LayerTCA(); fooSettings.settings.Default.myLayerTCA = layerTCA; 그리고 검색 할 반대. – Vidar

+0

약간의 업데이트 : 여기에 몇 가지 테스트를 시도해 보았습니다. COM 변수가없는 한 Settings.setting 파일에 클래스를 저장할 수있는 것으로 보입니다. FeatureClass를 직렬화 할 때 무시되도록 속성을 지정하는 방법이 있어야합니다. – Vidar

답변

1

은 내가 IFeatureClassName 인 멤버 변수를 사용하십시오 : 여기

는 코드입니다. 생성자는 IFeatureclass를 수락 한 다음 피쳐 클래스를 IDataset으로 캐스팅하고 멤버 변수를 IDataset.FullName으로 설정합니다. 이것은 IName이 될 것입니다. 모든 IName 개체는 IPersistStream을 통해 지속 가능합니다. xml에 직접 직렬화 할 수는 없지만 IPersistStream 객체는 byte [] (MemoryBlobStream을 통해)에 기록 될 수 있습니다. byte []가 XmlAttribute를 통해 노출 될 수 있는지 기억할 수 없습니다. 아마도 base64를 사용해야합니다. Open 메서드는 포함 된 멤버 featureclassname 변수에서 IName.Open을 호출하고 IFeatureclass를 반환합니다.

업데이트 : 다음은 featureclassname을 문자열로 변환하는 데 도움이되는 코드입니다.

public static void TestIt(IFeatureClass fc) 
{ 
    string guidplusbase64Name = GetFullName((IDataset)fc); 
    Debug.Print(guidplusbase64Name); 
    IFeatureClass fc2 = OpenDataset(guidplusbase64Name) as IFeatureClass; 
    Debug.Print(fc2.AliasName);    
} 

public static string GetFullName(IDataset ds) 
{ 
    IPersistStream ps = ds.FullName as IPersistStream; 
    Guid g; 
    ps.GetClassID(out g);    
    IMemoryBlobStream mbs = new MemoryBlobStreamClass(); 
    ps.Save(mbs,0); 
    object bytes; 
    ((IMemoryBlobStreamVariant)mbs).ExportToVariant(out bytes);    
    return String.Format("{0};{1}",g,Convert.ToBase64String((byte[])bytes)); 
} 

public static IDataset OpenDataset(string guidplusbase64Name) 
{ 
    int idx = guidplusbase64Name.IndexOf(";"); 
    string base64Name = guidplusbase64Name.Substring(idx+1); 
    string guidString = guidplusbase64Name.Substring(0, idx); 

    byte[] bytes = Convert.FromBase64String(base64Name); 
    IMemoryBlobStream mbs = new MemoryBlobStreamClass(); 
    ((IMemoryBlobStreamVariant)mbs).ImportFromVariant(bytes); 
    Type t = Type.GetTypeFromCLSID(new Guid(guidString)); 
    IName n = Activator.CreateInstance(t) as IName; 
    ((IPersistStream)n).Load(mbs); 
    IDataset ds = n.Open() as IDataset; 
    return ds; 
} 

(모든 IDataset와 함께 작동하도록 업데이트뿐만 아니라 featureclasses) (갱신 2 : 그것은 어떤 데이터 세트로 작업 할 수 있습니다 CLSID을 연결, 이전 버전 featureclassname에 대한 고정 배선 된)

에게

이 안 함 왜 ESRI는 IName.NameString을 구현하지 않았습니까?

NameString 속성은 나중에 사용하기 위해 을 예약되어 있습니다. 구현 될 때 은 의 문자열 표현을 이라는 객체의 위치 구성 요소로 반환합니다.이 객체는 응용 프로그램에 의해 유지 될 수 있습니다.

+0

이것은 재미있어 보입니다 - 이제 자세히 살펴 보겠습니다 ... – Vidar

관련 문제