verwendet wird Ich habe einen WCF-Dienst. Es verwendet Linq-to-Objekte, um aus einem Dictionary auszuwählen. Der Objekttyp ist einfach:Parameter des Typs 'System.Linq.Enumerable ...' kann nicht serialisiert werden, wenn WCF, LINQ, JSON
public class User
{
public Guid Id;
public String Name;
}
Es ist eine Sammlung von in einem Dictionary<Guid,User>
gespeichert.
Ich möchte ein WCF OperationContract
Methode wie diese haben:
public IEnumerable<Guid> GetAllUsers()
{
var selection = from user in list.Values
select user.Id;
return selection;
}
Es fein kompiliert, aber wenn ich es benutze ich:
Der Server ist ein Fehler aufgetreten Verarbeiten der Anforderung. Die Ausnahmemeldung lautet 'Serialisierungsparameter vom Typ' System.Linq.Enumerable + WhereSelectEnumerableIterator
2[Cheeso.Samples.Webservices._2010.Jan.User,System.Guid]' (for operation 'GetAllUsers', contract 'IJsonService') because it is not the exact type 'System.Collections.Generic.IEnumerable
1 [System.Guid] 'in der Methodensignatur und ist nicht in der bekannten Typenauflistung. Um den Parameter zu serialisieren, fügen Sie den Typ der bekannten Typenauflistung für die Operation hinzu, die ServiceKnownTypeAttribute verwendet. Weitere Informationen finden Sie in den Serverprotokollen.
Wie kann ich die Auswahl zu einem IEnumerable<Guid>
zwingen?
EDIT
Wenn ich den Code ändern, um dies zu tun, es funktioniert gut - gute Interoperabilität.
public List<Guid> GetAllUsers()
{
var selection = from user in list.Values
select user.Id;
return new List<Guid>(selection);
}
Gibt es eine Möglichkeit für mich, die Schaffung/Instanziierung des List<T>
zu vermeiden?
Ich denke, ich versuche nicht so sehr, ein IEnumerable zu verteilen. Was ich wirklich liefern möchte, ist eine Liste von Guids. aber ich wollte nicht unnötiges Casting machen müssen, um das zu ermöglichen. In der Tat kann ich nur den Rückgabetyp der Methode zu einer Liste ändern, und dann eine neue Liste erstellen die Auswahl in den List-Konstruktor übergeben - das funktioniert gut und der Client bekommt die Liste, wie ich will. Einfach genug. Ich hatte gehofft, dass die explizite Erstellung der Liste unnötig wäre. –
Cheeso
IEnumerable <> ist nur eine Schnittstelle, und es ist nicht ganz korrekt zu sagen, dass es nicht interoperabel ist, da dies vom initialisierten Typ abhängt, der IEnumerable <> implementiert, der von der Methode zurückgegeben wird. Ich habe IEnumerable <> als eine Rückkehr von Service-Operationen ohne Problem verwendet, aber der Schlüssel ist, dass der Rückgabewert der Operation ordnungsgemäß initialisiert werden muss. – Kwal
MattK - Wie kann ich linq-to-objects verwenden, um eine Abfrage auszuführen, die zu einem IEnumerable führt, das ich von einer WCF-exposed-Methode zurückgeben kann? –
Cheeso