diff --git a/pyrsistent/_field_common.py b/pyrsistent/_field_common.py
index 6934978..04231c0 100644
--- a/pyrsistent/_field_common.py
+++ b/pyrsistent/_field_common.py
@@ -2,7 +2,8 @@ from collections import Iterable
 import six
 from pyrsistent._checked_types import (
     CheckedType, CheckedPSet, CheckedPMap, CheckedPVector,
-    optional as optional_type, InvariantException, get_type, wrap_invariant)
+    optional as optional_type, InvariantException, get_type, wrap_invariant,
+    _restore_pickle)
 
 
 def set_fields(dct, bases, name):
@@ -121,12 +122,42 @@ class PTypeError(TypeError):
         self.actual_type = actual_type
 
 
-def _sequence_field(checked_class, suffix, item_type, optional, initial):
+SEQ_FIELD_TYPE_SUFFIXES = {
+    CheckedPVector: "PVector",
+    CheckedPSet: "PSet",
+}
+
+# Global dictionary to hold auto-generated field types: used for unpickling
+_seq_field_types = {}
+
+def _restore_seq_field_pickle(checked_class, item_type, data):
+    """Unpickling function for auto-generated PVec/PSet field types."""
+    type_ = _seq_field_types[checked_class, item_type]
+    return _restore_pickle(type_, data)
+
+def _make_seq_field_type(checked_class, item_type):
+    """Create a subclass of the given checked class with the given item type."""
+    type_ = _seq_field_types.get((checked_class, item_type))
+    if type_ is not None:
+        return type_
+
+    class TheType(checked_class):
+        __type__ = item_type
+
+        def __reduce__(self):
+            return (_restore_seq_field_pickle,
+                    (checked_class, item_type, list(self)))
+
+    suffix = SEQ_FIELD_TYPE_SUFFIXES[checked_class]
+    TheType.__name__ = item_type.__name__.capitalize() + suffix
+    _seq_field_types[checked_class, item_type] = TheType
+    return TheType
+
+def _sequence_field(checked_class, item_type, optional, initial):
     """
     Create checked field for either ``PSet`` or ``PVector``.
 
     :param checked_class: ``CheckedPSet`` or ``CheckedPVector``.
-    :param suffix: Suffix for new type name.
     :param item_type: The required type for the items in the set.
     :param optional: If true, ``None`` can be used as a value for
         this field.
@@ -134,9 +165,7 @@ def _sequence_field(checked_class, suffix, item_type, optional, initial):
 
     :return: A ``field`` containing a checked class.
     """
-    class TheType(checked_class):
-        __type__ = item_type
-    TheType.__name__ = item_type.__name__.capitalize() + suffix
+    TheType = _make_seq_field_type(checked_class, item_type)
 
     if optional:
         def factory(argument):
@@ -164,7 +193,7 @@ def pset_field(item_type, optional=False, initial=()):
 
     :return: A ``field`` containing a ``CheckedPSet`` of the given type.
     """
-    return _sequence_field(CheckedPSet, "PSet", item_type, optional,
+    return _sequence_field(CheckedPSet, item_type, optional,
                            initial)
 
 
@@ -180,13 +209,41 @@ def pvector_field(item_type, optional=False, initial=()):
 
     :return: A ``field`` containing a ``CheckedPVector`` of the given type.
     """
-    return _sequence_field(CheckedPVector, "PVector", item_type, optional,
+    return _sequence_field(CheckedPVector, item_type, optional,
                            initial)
 
 
 _valid = lambda item: (True, "")
 
 
+# Global dictionary to hold auto-generated field types: used for unpickling
+_pmap_field_types = {}
+
+def _restore_pmap_field_pickle(key_type, value_type, data):
+    """Unpickling function for auto-generated PMap field types."""
+    type_ = _pmap_field_types[key_type, value_type]
+    return _restore_pickle(type_, data)
+
+def _make_pmap_field_type(key_type, value_type):
+    """Create a subclass of CheckedPMap with the given key and value types."""
+    type_ = _pmap_field_types.get((key_type, value_type))
+    if type_ is not None:
+        return type_
+
+    class TheMap(CheckedPMap):
+        __key_type__ = key_type
+        __value_type__ = value_type
+
+        def __reduce__(self):
+            return (_restore_pmap_field_pickle,
+                    (self.__key_type__, self.__value_type__, dict(self)))
+
+    TheMap.__name__ = (key_type.__name__.capitalize() +
+                       value_type.__name__.capitalize() + "PMap")
+    _pmap_field_types[key_type, value_type] = TheMap
+    return TheMap
+
+
 def pmap_field(key_type, value_type, optional=False, invariant=PFIELD_NO_INVARIANT):
     """
     Create a checked ``PMap`` field.
@@ -199,11 +256,7 @@ def pmap_field(key_type, value_type, optional=False, invariant=PFIELD_NO_INVARIA
 
     :return: A ``field`` containing a ``CheckedPMap``.
     """
-    class TheMap(CheckedPMap):
-        __key_type__ = key_type
-        __value_type__ = value_type
-    TheMap.__name__ = (key_type.__name__.capitalize() +
-                       value_type.__name__.capitalize() + "PMap")
+    TheMap = _make_pmap_field_type(key_type, value_type)
 
     if optional:
         def factory(argument):

p*_field prevents pickle from working on a PClass
I would never use pickle in production, but as I was trying to write some strawman example storage code for an example app, I discovered that while I could pickle basic PClasses, I can't pickle any that use pmap_field or pvector_field (and probably others that have similar implementations)

e.g.:

```
>>> class Foo(PClass):
...  v = pvector_field(int)
...
>>> Foo()
Foo(v=IntPVector([]))
>>> dumps(Foo())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cPickle.PicklingError: Can't pickle <class 'pyrsistent._field_common.IntPVector'>: attribute lookup pyrsistent._field_common.IntPVector failed
```

The same happens for `pmap_field`.

I guess this is because of the way that those functions generate classes at runtime?

@tobgu if you can let me know what needs done to fix this I can try to submit a PR.
diff --git a/tests/class_test.py b/tests/class_test.py
index f7254b4..0caddba 100644
--- a/tests/class_test.py
+++ b/tests/class_test.py
@@ -2,7 +2,9 @@ from collections import Hashable
 import math
 import pickle
 import pytest
-from pyrsistent import field, InvariantException, PClass, optional, CheckedPVector
+from pyrsistent import (
+    field, InvariantException, PClass, optional, CheckedPVector,
+    pmap_field, pset_field, pvector_field)
 
 
 class Point(PClass):
@@ -11,6 +13,12 @@ class Point(PClass):
     z = field(type=int, initial=0)
 
 
+class TypedContainerObj(PClass):
+    map = pmap_field(str, str)
+    set = pset_field(str)
+    vec = pvector_field(str)
+
+
 def test_evolve_pclass_instance():
     p = Point(x=1, y=2)
     p2 = p.set(x=p.x+2)
@@ -165,6 +173,12 @@ def test_supports_pickling():
     assert isinstance(p2, Point)
 
 
+def test_supports_pickling_with_typed_container_fields():
+    obj = TypedContainerObj(map={'foo': 'bar'}, set=['hello', 'there'], vec=['a', 'b'])
+    obj2 = pickle.loads(pickle.dumps(obj))
+    assert obj == obj2
+
+
 def test_can_remove_optional_member():
     p1 = Point(x=1, y=2)
     p2 = p1.remove('y')
@@ -250,4 +264,4 @@ def test_multiple_global_invariants():
         MultiInvariantGlobal(one=1)
         assert False
     except InvariantException as e:
-        assert e.invariant_errors == (('x', 'y'),)
\ No newline at end of file
+        assert e.invariant_errors == (('x', 'y'),)
diff --git a/tests/record_test.py b/tests/record_test.py
index 9146bd0..b2439e5 100644
--- a/tests/record_test.py
+++ b/tests/record_test.py
@@ -13,6 +13,12 @@ class ARecord(PRecord):
     y = field()
 
 
+class RecordContainingContainers(PRecord):
+    map = pmap_field(str, str)
+    vec = pvector_field(str)
+    set = pset_field(str)
+
+
 def test_create():
     r = ARecord(x=1, y='foo')
     assert r.x == 1
@@ -223,6 +229,11 @@ def test_pickling():
     assert x == y
     assert isinstance(y, ARecord)
 
+def test_supports_pickling_with_typed_container_fields():
+    obj = RecordContainingContainers(
+        map={'foo': 'bar'}, set=['hello', 'there'], vec=['a', 'b'])
+    obj2 = pickle.loads(pickle.dumps(obj))
+    assert obj == obj2
 
 def test_all_invariant_errors_reported():
     class BRecord(PRecord):

pip install -e .
parse_log_pytest
requirements.txt
pytest pytest-cov
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
attrs==25.3.0
babel==2.17.0
cachetools==5.5.2
certifi==2025.1.31
chardet==5.2.0
charset-normalizer==3.4.1
colorama==0.4.6
coverage==7.8.0
distlib==0.3.9
docutils==0.21.2
exceptiongroup==1.2.2
filelock==3.18.0
hypothesis==6.130.5
idna==3.10
imagesize==1.4.1
importlib_metadata==8.6.1
iniconfig==2.1.0
Jinja2==3.1.6
MarkupSafe==3.0.2
memory_profiler==0.31
packaging==24.2
platformdirs==4.3.7
pluggy==1.5.0
psutil==2.1.1
py==1.11.0
Pygments==2.19.1
pyperform==1.86
pyproject-api==1.9.0
-e git+https://github.com/tobgu/pyrsistent.git@d35ea98728473bd070ff1e6ac5304e4e12ea816c#egg=pyrsistent
pytest==8.3.5
pytest-cov==6.0.0
requests==2.32.3
six==1.17.0
snowballstemmer==2.2.0
sortedcontainers==2.4.0
Sphinx==7.4.7
sphinx_rtd_theme==0.1.5
sphinxcontrib-applehelp==2.0.0
sphinxcontrib-devhelp==2.0.0
sphinxcontrib-htmlhelp==2.1.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==2.0.0
sphinxcontrib-serializinghtml==2.0.0
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
urllib3==2.3.0
virtualenv==20.29.3
zipp==3.21.0

name: pyrsistent
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - attrs==25.3.0
      - babel==2.17.0
      - cachetools==5.5.2
      - certifi==2025.1.31
      - chardet==5.2.0
      - charset-normalizer==3.4.1
      - colorama==0.4.6
      - coverage==7.8.0
      - distlib==0.3.9
      - docutils==0.21.2
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - hypothesis==6.130.5
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - memory-profiler==0.31
      - packaging==24.2
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - psutil==2.1.1
      - py==1.11.0
      - pygments==2.19.1
      - pyperform==1.86
      - pyproject-api==1.9.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - requests==2.32.3
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sortedcontainers==2.4.0
      - sphinx==7.4.7
      - sphinx-rtd-theme==0.1.5
      - sphinxcontrib-applehelp==2.0.0
      - sphinxcontrib-devhelp==2.0.0
      - sphinxcontrib-htmlhelp==2.1.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==2.0.0
      - sphinxcontrib-serializinghtml==2.0.0
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - virtualenv==20.29.3
      - zipp==3.21.0
prefix: /opt/conda/envs/pyrsistent

tests/class_test.py::test_supports_pickling_with_typed_container_fields tests/record_test.py::test_supports_pickling_with_typed_container_fields
tests/class_test.py::test_evolve_pclass_instance tests/class_test.py::test_direct_assignment_not_possible tests/class_test.py::test_direct_delete_not_possible tests/class_test.py::test_cannot_construct_with_undeclared_fields tests/class_test.py::test_cannot_construct_with_wrong_type tests/class_test.py::test_cannot_construct_without_mandatory_fields tests/class_test.py::test_field_invariant_must_hold tests/class_test.py::test_initial_value_set_when_not_present_in_arguments tests/class_test.py::test_can_create_nested_structures_from_dict_and_serialize_back_to_dict tests/class_test.py::test_can_serialize_with_custom_serializer tests/class_test.py::test_implements_proper_equality_based_on_equality_of_fields tests/class_test.py::test_is_hashable tests/class_test.py::test_supports_nested_transformation tests/class_test.py::test_repr tests/class_test.py::test_global_invariant_check tests/class_test.py::test_supports_pickling tests/class_test.py::test_can_remove_optional_member tests/class_test.py::test_cannot_remove_mandatory_member tests/class_test.py::test_cannot_remove_non_existing_member tests/class_test.py::test_evolver_without_evolution_returns_original_instance tests/class_test.py::test_evolver_with_evolution_to_same_element_returns_original_instance tests/class_test.py::test_evolver_supports_chained_set_and_remove tests/class_test.py::test_string_as_type_specifier tests/class_test.py::test_multiple_invariants_on_field tests/class_test.py::test_multiple_global_invariants tests/record_test.py::test_create tests/record_test.py::test_correct_assignment tests/record_test.py::test_direct_assignment_not_possible tests/record_test.py::test_cannot_assign_undeclared_fields tests/record_test.py::test_cannot_assign_wrong_type_to_fields tests/record_test.py::test_cannot_construct_with_undeclared_fields tests/record_test.py::test_cannot_construct_with_fields_of_wrong_type tests/record_test.py::test_support_record_inheritance tests/record_test.py::test_single_type_spec tests/record_test.py::test_remove tests/record_test.py::test_remove_non_existing_member tests/record_test.py::test_field_invariant_must_hold tests/record_test.py::test_global_invariant_must_hold tests/record_test.py::test_set_multiple_fields tests/record_test.py::test_initial_value tests/record_test.py::test_type_specification_must_be_a_type tests/record_test.py::test_initial_must_be_of_correct_type tests/record_test.py::test_invariant_must_be_callable tests/record_test.py::test_global_invariants_are_inherited tests/record_test.py::test_global_invariants_must_be_callable tests/record_test.py::test_repr tests/record_test.py::test_factory tests/record_test.py::test_factory_must_be_callable tests/record_test.py::test_nested_record_construction tests/record_test.py::test_pickling tests/record_test.py::test_all_invariant_errors_reported tests/record_test.py::test_precord_factory_method_is_idempotent tests/record_test.py::test_serialize tests/record_test.py::test_nested_serialize tests/record_test.py::test_serializer_must_be_callable tests/record_test.py::test_transform_without_update_returns_same_precord tests/record_test.py::test_nested_create_serialize tests/record_test.py::test_pset_field_initial_value tests/record_test.py::test_pset_field_custom_initial tests/record_test.py::test_pset_field_factory tests/record_test.py::test_pset_field_checked_set tests/record_test.py::test_pset_field_type tests/record_test.py::test_pset_field_mandatory tests/record_test.py::test_pset_field_default_non_optional tests/record_test.py::test_pset_field_explicit_non_optional tests/record_test.py::test_pset_field_optional tests/record_test.py::test_pset_field_name tests/record_test.py::test_pvector_field_initial_value tests/record_test.py::test_pvector_field_custom_initial tests/record_test.py::test_pvector_field_factory tests/record_test.py::test_pvector_field_checked_vector tests/record_test.py::test_pvector_field_type tests/record_test.py::test_pvector_field_mandatory tests/record_test.py::test_pvector_field_default_non_optional tests/record_test.py::test_pvector_field_explicit_non_optional tests/record_test.py::test_pvector_field_optional tests/record_test.py::test_pvector_field_name tests/record_test.py::test_pvector_field_create_from_nested_serialized_data tests/record_test.py::test_pmap_field_initial_value tests/record_test.py::test_pmap_field_factory tests/record_test.py::test_pmap_field_checked_map_key tests/record_test.py::test_pmap_field_checked_map_value tests/record_test.py::test_pmap_field_mandatory tests/record_test.py::test_pmap_field_default_non_optional tests/record_test.py::test_pmap_field_explicit_non_optional tests/record_test.py::test_pmap_field_optional tests/record_test.py::test_pmap_field_name tests/record_test.py::test_pmap_field_invariant tests/record_test.py::test_pmap_field_create_from_nested_serialized_data
pyrsistent/_field_common.py
pyrsistent/_field_common.py