2013-08-28 4 views
0

2 개의 특성을 가진 클래스가 있습니다. 하나의 속성은 HttpResponseMessage이며이를 직렬화해야합니다. 나는 HttpResponse를 통해 클래스와 [DataMember]에 대해 [DataContract]를 만들었다.HttpResponseMessage serialization

An exception of type 'System.Runtime.Serialization.InvalidDataContractException' occurred 
in mscorlib.dll but was not handled in user code 
Additional information: Type 'System.Net.Http.StreamContent' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all of its 
members you want serialized with the DataMemberAttribute attribute. If the type is a  
collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft 
.NET Framework documentation for other supported types. 

잘못된 것입니다 : 나는이 오류가 다음을 테스트 할 때

[DataContract] 
public class ResponseItem 
{ 
    [DataMember] 
    public HttpResponseMessage ResponseMessage { get; set; } 
    [DataMember] 
    public CacheInfoItem CacheInfo { get; set; } 
} 

문제는 다음과 같습니다 클래스입니까?

편집 : 나는 저장 방법이 있습니다

public static async Task SaveObjectAsync(Object toBeSaved, string fileName = null, 
StorageLocation storageLocation = StorageLocation.Local, SerializerType serializerType = 
SerializerType.DataContractJson) 
    { 
     Type type = toBeSaved.GetType(); 
     fileName = getFileName(fileName, type, serializerType); 
     StorageFolder folder = getStorageFolder(storageLocation); 
     MemoryStream memoryStream = new MemoryStream(); 
     Serializer serializer = getSerializer(serializerType, type); 
     serializer.WriteObject(memoryStream, toBeSaved); 
     StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 
     using (Stream fileStream = await file.OpenStreamForWriteAsync()) 
     { 
      memoryStream.Seek(0, SeekOrigin.Begin); 
      await memoryStream.CopyToAsync(fileStream); 
      await fileStream.FlushAsync(); 
     } 
    } 

를하지만 시리얼 라이저가 직렬화하기 위해 클래스의 상단에 [Serialize]를 추가 HttpResponseMessage에게

+2

왜이 유형은 직렬화 될 수 있다는 생각? 무엇을 성취하려고합니까? –

+0

나는 그것이 직렬화 될 수 있는지 정말로 모른다. 응답 메시지를 저장하고 싶습니다. – newone

+0

메시지를 꺼내서 메시지를 직렬화하십시오. 게으르지 말고 모든 것을 직렬화하려고 시도하십시오. –

답변

0

를 처리 할 수 ​​있음을 보인다.

EDIT : Win RT에 대해 알지 못했습니다.

를 사용하여 직렬화 된 클래스로이 클래스 :

class LocalStorage 
{ 
    private static List<object> _data = new List<object>(); 


    public static List<object> Data 
    { 
     get { return _data; } 
     set { _data = value; } 
    } 

    private const string filename = "cats.xml"; 

    static async public Task Save<T>() 
    { 
     await Windows.System.Threading.ThreadPool.RunAsync((sender) => LocalStorage.SaveAsync<T>().Wait(), Windows.System.Threading.WorkItemPriority.Normal); 
    } 

    static async public Task Restore<T>() 
    { 
      await Windows.System.Threading.ThreadPool.RunAsync((sender) => LocalStorage.RestoreAsync<T>().Wait(), Windows.System.Threading.WorkItemPriority.Normal); 
    } 

    static async private Task SaveAsync<T>() 
    { 
     StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
     IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite); 
     IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0); 
     var sessionSerializer = new DataContractSerializer(typeof(List<object>), new Type[] { typeof(T) }); 
     sessionSerializer.WriteObject(sessionOutputStream.AsStreamForWrite(), _data); 
     await sessionOutputStream.FlushAsync(); 
    } 

    static async private Task RestoreAsync<T>() 
    { 
     StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.OpenIfExists); 
     if (sessionFile == null) 
     { 
      return; 
     } 
     IInputStream sessionInputStream = await sessionFile.OpenReadAsync(); 
     var sessionSerializer = new DataContractSerializer(typeof(List<object>), new Type[] { typeof(T) }); 
     _data = (List<object>)sessionSerializer.ReadObject(sessionInputStream.AsStreamForRead()); 
    } 
} 

그리고 헬퍼 클래스를 사용하는 필수 코드 :이 경우는 직렬화 헬퍼 클래스를 만들 필요가

namespace SerializeListWinRT 
{ 

public sealed partial class MainPage : Page 
{ 
    private readonly ObservableCollection<Cat> _cats = new ObservableCollection<Cat>(); 

    public ObservableCollection<Cat> Cats 
    { 
     get { return _cats; } 
    } 

    public MainPage() 
    { 
     this.InitializeComponent(); 
     ClearLists(); 
     AddCatsToList(); 
     CreateNewCat(); 
    } 

    private async void AddCatsToList() 
    { 
     await LocalStorage.Restore<Cat>(); 
     SetCatList(); 
    } 

    private void ClearLists() 
    { 
     Cats.Clear(); 
     LocalStorage.Data.Clear(); 
    } 

    private void SetCatList() 
    { 
     foreach (var item in LocalStorage.Data) 
     { 
      _cats.Add(item as Cat); 
     } 
    } 

    public Cat NewCat { get; set; } 

    private void CreateNewCat() 
    { 
     NewCat = new Cat(); 
    } 

    private void AddNewCat() 
    { 
     _cats.Add(new Cat {Name = NewCat.Name, About = NewCat.About}); 
    } 
    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     AddNewCat(); 
    } 

    private void Button_Click_2(object sender, RoutedEventArgs e) 
    { 
     AddNewCat(); 
     SaveList(); 
    } 

    private void SaveList() 
    { 
     LocalStorage.Data.Add(NewCat); 
     LocalStorage.Save<Cat>(); 
    } 

} 
} 

LocalStorage.Save<Cat>();은 원하는대로 들리며 일련 번호를 저장하고 저장합니다.

참조 : http://irisclasson.com/2012/07/09/example-metro-app-winrt-serializing-and-deseralizing-objects-to-storagefile-and-localfolder-using-generics-and-asyncawait-threading/

+0

.Net 클래스 용으로 어떻게 구현할 것을 제안합니까? –

+0

WinRT 용이며 [Serialize]를 설정할 수 없습니다 – newone

+0

원래 게시물의 편집을 참조하십시오. – newone