プロジェクトには、キャッシュ情報を含むクラスがあります。
public class SOLECache
{
public DateTime CreatedDTM { get; set; }
public int UserID { get; set; }
public int MaxAgeSeconds { get; set; }
public object Data { get; set; }
}
ここで、プロパティ Data は、キャッシュしたいオブジェクトを保持します。これは、任意の型である可能性があります。複数の Web サーバーを備えた運用環境があるため、キャッシュを処理するために Redis と ServiceStack を使用しようとしています。現在、キャッシュは Redis サーバーに適切に保存されており、その部分は正常に機能しています。問題は、キャッシュを取得しようとするときです。
_cacheClient.Get<AppUser>("someCacheKey");
Data プロパティの値は常に NULL です。したがって、基本的に、データが適切なキーの下で Redis サーバーに保存されていることは明らかですが、データを取得すると、常に NULL である Data プロパティ以外のすべてが取得されます。
なぜこれが当てはまるのか、誰かが私に洞察を与えることができますか? data プロパティに保存しているオブジェクトに、いくつかの読み取り専用プロパティといくつかのメソッドがあるためでしょうか? これはクリーンな POCO ではありませんか? 格納されているオブジェクトのサンプル構造を次に示します。
public class AppUser
{
public int UserId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string FullName
{
get {
return FirstName + " " + LastName;
}
}
public void DoSomething()
{
// some method logic here...
}
}
このクラスが原因で ServiceStack.RedisClient が AppUser インスタンスを適切にシリアル化できない可能性はありますか?
Redis でキャッシュを設定する方法は次のとおりです。
_cacheClient.Set("someCacheKey", soleCache, DateTime.UtcNow.AddSeconds(soleCache.MaxAgeSeconds))
ここで、soleCache は、Data プロパティが設定された SOLECache のインスタンスです。Redis に保存されるデータは次のとおりです。
{"CreatedDTM":"2013-06-28T13:45:56.5091664-04:00","UserID":123,"MaxAgeSeconds":60,"Data":{"FullName":"John M Doe","FirstName":"John","MiddleName":"M","LastName":"Doe","Email":"me@here.com","BackupEmail":"me@there.com","GradYear":null,"PostalCode":"12345 ","Location":"12345 ","City":null,"IsValid":true,"Active":true,"AccessLevel":10,"CurrentApp":0,"CurrentURL":"http://localhost:4387/","RequestMethod":"GET","IsMobile":false,"IsInApp":false,"ServerName":"ITSWEB-JMDOE","ID":40117,"IsAdmin":true,"Theme":"basic","ExpirationDT":null,"WebFolderName":"jmdoe","ProgramCD":null,"BranchCD":"MBIM","RoleOverride":0,>"CurrentAppRoleID":0,"EnableNativeMailFLG":false,"PasswordStatus":"GOOD","CampusCD":"M","Campus":"Smallville","DisclaimerDate":"2012-07-02T10:55:54.297","SecurityQuestion":null,"ClassificationMSK":4,"IsLinkedToCurrentApp":false,"IsBlockedFromCurrentApp":false,"IsBlockedMessageText":null,"CurrentAppRoleName":null,"AssignedAppRoleID":0,"AppSmallGroup":0,"PermissionsArray":[],"AdminPermissionsArray":[],"ViewLevel":[],"LastLoginDTM":"2013-06-27T16:28:23.21","Session":{"SessionID":"1923dac2-f3af-4dc5-ad51-7202fc077ba3","SessionCreatedDTM":"2013-06-28T09:03:13.12","SessionTimeout":60,"SessionUserID":40117,"SessionCurrentApp":0,"SessionLastViewDTM":"2013-06-28T13:24:37.69","SessionUserAgent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36","SessionIP":"127.0.0.1","SessionLastURL":"http://localhost:4387/Home/CacheInfo","SessionServer":"ITSWEB-JMDOE","LastLoginDTM":null,"SessionLoginMethod":null,"ADUserName":null,"ADPassword":null,"Errors":{},"HasErrors":false,"ModelState":{}},"CurrentInstanceID":0,"CurrentPageHasNotes":false,"CurrentPageIsFavorited":false,"BrowserBrand":"Chrome","BrowserVersion":"28.0","BrowserPlatform":"Windows 8","BrowserValid":true,"Favorites":[],"FullNameWithEmail":"John M Doe (jmdoe@here.com)","FullNameWithoutMiddleName":"John Doe","IsStudent":true,"Errors":{},"HasErrors":false,"ModelState":{}}}
何らかの理由でこのオブジェクトを適切にシリアル化しない ServiceStack.Text.JsonSerializer メソッドに問題があることを突き止めました。このメソッドを NewtonSoft の Json Serializer に置き換えると、正常に動作します... ServiceStack の問題のようですが、間違っている可能性があります...