2015-02-26 1 views
1

je les types suivants:"InvalidDataContractException: Type contient deux membres avec les mêmes données nom de membre" sans raison apparente

Type de base:

[DataContract(Name = "protectedFile", Namespace = Constants.ManagementNamespace)] 
    public class ProtectedFile 
    { 
     public ProtectedFile(string virtualDiskName, FileIdInfo fileIdInfo) 
     { 
      VirtualDiskName = virtualDiskName; 
      FileIdInfo = fileIdInfo; 
     } 

    /// <summary> 
    /// Gets or sets file id information 
    /// </summary> 
    [DataMember(Name = "fileIdInfo")] 
    public FileIdInfo FileIdInfo { get; set; } 

    /// <summary> 
    /// Gets or sets Virtual Disk Name 
    /// </summary> 
    [DataMember(Name = "virtualDiskName")] 
    public string VirtualDiskName { get; set; } 

     // .. Equality members 

    } 

ProtectedFile contient des types:

[Serializable] 
    [DataContract(Name = "FileIdInfo", Namespace = Constants.ManagementNamespace)] 
    public sealed class FileIdInfo 
    { 
     public FileIdInfo() 
     { 
     } 

     public FileIdInfo(FileSystemFileIdInformation fsFileId, int driverFileId) 
     { 
      DriverFileId = driverFileId; 
      FsFileId = fsFileId; 
     } 

     /// <summary> 
     /// Gets or sets file system file id information 
     /// </summary> 
     [DataMember(Name = "fsFileId")] 
     public FileSystemFileIdInformation FsFileId { get; set; } 

     /// <summary> 
     /// Gets or sets driver file id information 
     /// </summary> 
     [DataMember(Name = "driverFileId")] 
     public int DriverFileId { get; set; } 

     // .. Equality members 
    } 


    [Serializable] 
    [DataContract(Name = "FileSystemFileIdInformation", Namespace = Constants.ManagementNamespace)] 
    [StructLayout(LayoutKind.Sequential)] 
    public struct FileSystemFileIdInformation 
    { 
     [DataMember(Name = "VolumeSerialNumber")] 
     private readonly ulong _volumeSerialNumber; 

     [DataMember(Name = "FileId")] 
     private readonly FileId128 _fileId; 

     public ulong VolumeSerialNumber 
     { 
      get { return _volumeSerialNumber; } 
     } 

     public FileId128 FileId 
     { 
      get { return _fileId; } 
     } 

     // .. Equality members 
    } 

    /// <summary> 
    /// File Identifier inside the volume (FILE_ID_128 at ntifs.h/winnt.h) 
    /// </summary> 
    [Serializable] 
    [DataContract(Name = "FileId128", Namespace = Constants.ManagementNamespace)] 
    [StructLayout(LayoutKind.Sequential)] 
    public struct FileId128 
    { 
     [DataMember(Name = "highPart")] 
     private readonly ulong _highPart; 

     [DataMember(Name = "lowPart")] 
     private readonly ulong _lowPart; 

     public ulong HighPart 
     { 
      get { return _highPart; } 
     } 

     public ulong LowPart 
     { 
      get { return _lowPart; } 
     } 

     // .. Equality members 
    } 

    /// <summary> 
    /// Internal file system file id - AAFILE_ID_INFORMATION from AAFileFilterCommon.h 
    /// </summary> 
    [Serializable] 
    [DataContract(Name = "FileSystemFileIdInformation", Namespace = Constants.ManagementNamespace)] 
    [StructLayout(LayoutKind.Sequential)] 
    public struct FileSystemFileIdInformation 
    { 
     [DataMember(Name = "VolumeSerialNumber")] 
     private readonly ulong _volumeSerialNumber; 

     [DataMember(Name = "FileId")] 
     private readonly FileId128 _fileId; 

     public ulong VolumeSerialNumber 
     { 
      get { return _volumeSerialNumber; } 
     } 

     public FileId128 FileId 
     { 
      get { return _fileId; } 
     } 

     // .. Equality members 
    } 

Tout semble bon, chaque membre de contrat de données a un nom unique mais je reçois une exception de sérialisation

 
InvalidDataContractException: 
FileIdInfo type contains two members FsFileId and DriverFileId with same 
data member name fsFileId 

Mais je n'ai qu'un seul membre avec ce nom. La seule chose inhabituelle est que j'utilise des structures comme membres de données, mais cela est pris en charge.

Qu'est-ce qui ne va pas?

Répondre

1

Je ne peux pas reproduire ce, juste au cas où - vous avez copié 2 fois FileSystemFileIdInformation Structure à

ProtectedFile contient des types:

j'ai écrit exemple simple de sérialisation et il fonctionne sans exceptions dans les deux sens (sérialisation et désérialisation) - mon seul changement est que j'ai ajouté des constructeurs pour les paramètres en lecture seule, mais cela n'a vraiment aucune importance pour la sérialisation.

var protectedFile= 
new ProtectedFile("C",new FileIdInfo(new FileSystemFileIdInformation(
         1, new FileId128(2,3)), 
       4)); 
      DataContractSerializer d = new DataContractSerializer(protectedFile.GetType()); 
      var stream = new MemoryStream(); 
      d.WriteObject(stream, protectedFile); 
      stream.Seek(0, SeekOrigin.Begin); 
      var fileAfterSerialization = d.ReadObject(stream);